使用 SDL_TTF 的 OpenGL 中的文本
Posted
技术标签:
【中文标题】使用 SDL_TTF 的 OpenGL 中的文本【英文标题】:Text in OpenGL using SDL_TTF 【发布时间】:2016-08-03 17:57:45 【问题描述】:我是 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
的矩形。我应该对我的代码进行哪些更改才能使其正常工作?
【问题讨论】:
抱歉,但我认为在尝试制作当前正在尝试的东西之前,您应该先了解更多关于 OpenGL 的知识。首先,OpenGL 没有内置文本函数,现代 OpenGL 也没有。此外,您不应该将这个旧的 OpenGL 1.1 与它的固定功能管道一起使用。它绝对已被完全弃用。而且我以前从未见过 glVertex2px 。我也找不到关于它的东西。所以最后,如果没有进一步的信息,很难从这种情况下说什么是错的。也许你设置的 Modelview/Projection 矩阵错误,所以你只能看到整体的一小部分? @Michael 关于glVertex2px
,这是我自己制作的一个宏,它使用窗口左上角的像素数来绘制东西,就像在 SDL 中一样。在 2D 中,我发现这更实用。我忘记在代码中包含它的定义,但我进行了编辑以纠正它。
【参考方案1】:
您生成的纹理填充了纯色。使它塑造文本的是 alpha 通道,但是您没有启用 alpha 混合,所以您看不到它。添加
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
或者至少是 alpha 测试(由于缺乏混合会产生更清晰的边缘 - 对于某些字体,这样看起来甚至更好)。
还请注意,您既没有释放生成的SDL_Surface
也没有释放 GL 纹理;这样你会很快耗尽内存。将数据复制到 GL 纹理后,可以重复使用纹理,并且可以释放 SDL_Surface。
【讨论】:
以上是关于使用 SDL_TTF 的 OpenGL 中的文本的主要内容,如果未能解决你的问题,请参考以下文章