2 xy707707 xy707707 于 2015.06.04 09:31 提问

opengl字符纹理的问题 5C

为甚么使用下面的函数制作的字符纹理显示不了

#define FONT_SIZE 64
#define TEXTURE_SIZE FONT_SIZE

GLuint drawChar_To_Texture(const char* s) {
wchar_t w;
HDC hDC = wglGetCurrentDC();

// 选择字体字号、颜色
// 不指定字体名字,操作系统提供默认字体
// 设置颜色为白色
selectFont(FONT_SIZE, DEFAULT_CHARSET, "");
glColor3f(1.0f, 1.0f, 1.0f);

// 转化为宽字符
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, s, 2, &w, 1);

// 计算绘制的位置
{
    int width, x, y;
    GetCharWidth32W(hDC, w, w, &width);    // 取得字符的宽度
    x = (TEXTURE_SIZE - width) / 2;
    y = FONT_SIZE / 8;
    glWindowPos2iARB(x, y); // 一个扩展函数
}

// 绘制字符
// 绘制前应该将各种可能影响字符颜色的效果关闭
// 以保证能够绘制出白色的字符
{
    GLuint list = glGenLists(1);

    glDisable(GL_DEPTH_TEST);
    glDisable(GL_LIGHTING);
    glDisable(GL_FOG);
    glDisable(GL_TEXTURE_2D);

    wglUseFontBitmaps(hDC, w, 1, list);
    glCallList(list);
    glDeleteLists(list, 1);
}

// 复制字符像素到纹理
// 注意纹理的格式
// 不使用通常的GL_RGBA,而使用GL_LUMINANCE4
// 因为字符本来只有一种颜色,使用GL_RGBA浪费了存储空间
// GL_RGBA可能占16位或者32位,而GL_LUMINANCE4只占4位
{
    GLuint texID;
    glGenTextures(1, &texID);
    glBindTexture(GL_TEXTURE_2D, texID);
    glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE4,
        0, 0, TEXTURE_SIZE, TEXTURE_SIZE, 0);
    glTexParameteri(GL_TEXTURE_2D,
        GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,
        GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    return texID;
}

}

1个回答

xy707707
xy707707   2015.06.04 09:39

完整的代码如下#define WindowWidth 400
#define WindowHeight 400
#define WindowTitle "OpenGL纹理测试"
#include
#include "Glee.h"
#include
#include
#include
#define FONT_SIZE 64
#define TEXTURE_SIZE FONT_SIZE

/* 函数grab

  • 抓取窗口中的像素
  • 假设窗口宽度为WindowWidth,高度为WindowHeight */ #define BMP_Header_Length 54 int power_of_two(int n) { if( n <= 0 ) return 0; return (n & (n-1)) == 0; }

void selectFont(int size, int charset, const char* face)
{
HFONT hFont = CreateFontA(size, 0, 0, 0, FW_MEDIUM, 0, 0, 0,
charset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, face);
HFONT hOldFont = (HFONT)SelectObject(wglGetCurrentDC(), hFont);
DeleteObject(hOldFont);
}

GLuint texWall2;

GLuint drawChar_To_Texture(const char* s)
{
wchar_t w;
HDC hDC = wglGetCurrentDC();

// 选择字体字号、颜色
// 不指定字体名字,操作系统提供默认字体
// 设置颜色为白色
selectFont(FONT_SIZE, DEFAULT_CHARSET, "");
glColor3f(1.0f, 1.0f, 1.0f);

// 转化为宽字符
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, s, 2, &w, 1);

// 计算绘制的位置
{
    int width, x, y;
    GetCharWidth32W(hDC, w, w, &width);    // 取得字符的宽度
    x = (TEXTURE_SIZE - width) / 2;
    y = FONT_SIZE / 8;
    if(GLEE_ARB_window_pos)
    {
        printf("zhichi");
        glWindowPos2iARB(x, y); // 一个扩展函数

    }
    else
        printf("buzhichi");
}

// 绘制字符
// 绘制前应该将各种可能影响字符颜色的效果关闭
// 以保证能够绘制出白色的字符
{
    GLuint list = glGenLists(1);

    glDisable(GL_DEPTH_TEST);
    glDisable(GL_LIGHTING);
    glDisable(GL_FOG);
    glDisable(GL_TEXTURE_2D);

    wglUseFontBitmapsW(hDC, w, 1, list);
    glCallList(list);
    glDeleteLists(list, 1);
}

// 复制字符像素到纹理
// 注意纹理的格式
// 不使用通常的GL_RGBA,而使用GL_LUMINANCE4
// 因为字符本来只有一种颜色,使用GL_RGBA浪费了存储空间
// GL_RGBA可能占16位或者32位,而GL_LUMINANCE4只占4位
{
    GLuint texID;
    glGenTextures(1, &texID);
    glBindTexture(GL_TEXTURE_2D, texID);
    glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
        0, 0, TEXTURE_SIZE, TEXTURE_SIZE, 0);
    glTexParameteri(GL_TEXTURE_2D,
        GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,
        GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    return texID;
}

}

void display(void)
{
// 清除屏幕
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

 // 设置视角
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluPerspective(75, 1, 1, 40);
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 gluLookAt(0, -10, 10, 0, 0, 0, 0, 0, 1);
 glColor3f(0.1f,0.1f,1.0f);


 glBindTexture(GL_TEXTURE_2D, texWall2);
 glBegin(GL_QUADS);
     glTexCoord2f(0.0f, 0.0f); glVertex3f(-8.0f, -8.0f, 0.0f);
     glTexCoord2f(0.0f, 5.0f); glVertex3f(-8.0f, 8.0f, 0.0f);
     glTexCoord2f(5.0f, 5.0f); glVertex3f(8.0f, 8.0f, 0.0f);
     glTexCoord2f(5.0f, 0.0f); glVertex3f(8.0f, -8.0f, 0.0f);
 glEnd();   
 glutSwapBuffers();

}

int main(int argc, char* argv[])
{
// GLUT初始化
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100, 100);
glutInitWindowSize(WindowWidth, WindowHeight);
glutCreateWindow(WindowTitle);
glutDisplayFunc(&display);

 // 在这里做一些初始化
 glEnable(GL_DEPTH_TEST);
 glEnable(GL_TEXTURE_2D);

 texWall2=drawChar_To_Texture("d");


 // 开始显示
 glutMainLoop();

return 0;

}

Csdn user default icon
上传中...
上传图片
插入图片