使用SDL_TTF在OpenGL中的文本

时间:2016-08-03 17:57:45

标签: c++ c opengl sdl sdl-ttf

我是OpenGL的初学者,我创建了一个使用SDL_TTF在OpenGL中编写文本的函数。这是我的函数的代码:

#define WINDOW_WIDTH 832
#define WINDOW_HEIGHT 487
#define glVertex2px(x,y) glVertex2d((double)(x) * 2.0 / (double)WINDOW_WIDTH - 1.0, 1.0 - (double)(y) * 2.0 / (double)WINDOW_HEIGHT);
void glWriteText2d(TTF_Font *font,const char *text,SDL_Color color,const int x,const int y){
    GLuint texture;
    SDL_Surface *surface;
    surface = TTF_RenderText_Blended(font,text,color);
    glGenTextures(1,&texture);
    glBindTexture(GL_TEXTURE_2D,texture);
    gluBuild2DMipmaps(GL_TEXTURE_2D,4,surface->w,surface->h,GL_RGBA,GL_UNSIGNED_BYTE,surface->pixels);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
    GLboolean textureIsEnabled = glIsEnabled(GL_TEXTURE_2D);
    glEnable(GL_TEXTURE_2D);
    glColor3ub(255,255,255);
    glBegin(GL_QUADS);
        glTexCoord2f(0,0);
        glVertex2px(x,y);
        glTexCoord2f(0,1);
        glVertex2px(x,y + surface->h);
        glTexCoord2f(1,1);
        glVertex2px(x + surface->w,y + surface->h);
        glTexCoord2f(1,0);
        glVertex2px(x + surface->w,y);
    glEnd();
    if(!textureIsEnabled){
        glDisable(GL_TEXTURE_2D);
    }
}

此功能不起作用,因为当我使用它时,它会在文本所在的位置绘制一个矩形,它是color的颜色。我应该在代码中更改哪些内容才能生效?

1 个答案:

答案 0 :(得分:2)

您生成的纹理填充纯色。使文本整形的原因是alpha通道,但您没有启用Alpha混合,因此您看不到它。添加

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

或至少是alpha测试(由于缺少混合会产生更锐利的边缘 - 对于某些字体,它甚至看起来更好)。

另请注意,您既未释放生成的SDL_Surface也未释放GL纹理;那样你就会很快耗尽内存。可以重复使用纹理,并且只要将数据复制到GL纹理就可以释放SDL_Surface。

相关问题