LF-DevJourney 2015-06-04 01:31 采纳率: 50%
浏览 2046
已结题

opengl字符纹理的问题

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

#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条回答

  • LF-DevJourney 2015-06-04 01: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;
    

    }

    评论

报告相同问题?

悬赏问题

  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名