【问题标题】:Render text in foreground在前景中渲染文本
【发布时间】:2026-02-13 17:25:03
【问题描述】:

我正在尝试在 MacOSX 10.7.2 下的 OpenGL/GLUT 应用程序的前台渲染一些字符串。

目前我正在使用此代码在前景中画几行,效果很好。

void drawForeground() {

int width = 10;
int height = 10;

glMatrixMode(GL_PROJECTION);                    
glPushMatrix(); 
glLoadIdentity();                           
glOrtho(-1, width, -1, height, -1, 1);      
glMatrixMode(GL_MODELVIEW);         

glPushMatrix(); 
glLoadIdentity();

glDepthMask(GL_FALSE);          

glBegin(GL_LINES);
//Draw the lines
glEnd();

/*********************/

glPopMatrix();      
glMatrixMode(GL_PROJECTION);                    
glPopMatrix();  
glDepthMask(GL_TRUE);   

}

现在我还想画一些文字。在前面的函数中,我在放置星号的行中添加了这段代码:

glRasterPos2d(2,2);
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_10, 'c');

但它没有工作。如果我在 drawForeground 方法之外使用相同的两行,则会出现“c”。
我已经打电话给glDisable(GL_TEXTURE_2D),没有任何改变。

有人可以帮我理解我的错误吗?

解决办法:

原来的解决方案是使用glDisable(GL_LIGHTING) 禁用照明,在渲染文本后重新启用它。

我想强调的是,文本始终以相同的维度呈现,独立于glOrtho 调用的参数。

【问题讨论】:

  • 你打电话给glOrtho() 对我来说似乎很奇怪。通常,我认为您希望它是glOrtho(0, pixelWidth, 0, pixelHeight, -1, 1);。实际上,您是说您的世界是 11 x 11 单位。字母可能会从屏幕边缘绘制出来,具体取决于 (2,2) 是基线、上升点还是下降点所在的位置。
  • @user1118321 感谢您的评论。在这种情况下,我认为我对glOrtho 的调用表现为隐式缩放。但是,即使按照您的建议进行更改(并使用 glRasterPos2d(width/2.0,height/2.0);),我仍然看不到任何字母。即使放大和缩小它似乎也没有效果。
  • 是的,这就是glOrtho() 所做的——隐式缩放。尝试将 18 点字符绘制到 11x11 区域似乎很奇怪。除此之外,你所拥有的看起来很合理。过程中是否有任何 OpenGL 错误?
  • @user1118321 好吧,实际上你说的很奇怪是对的 :) 目前我将其更改为 10 点字符。但是,即使它可能太大,我也应该同样能够看到一些东西,至少是部分字符。既没有 OpenGL 错误也没有警告...
  • 我不知道这是否相关,但是according to this page,您需要禁用 GL_TEXTURE_2D 才能获得要渲染的文本。不知道为什么。

标签: c++ opengl text graphics glut


【解决方案1】:

不确定,但如果您还没有尝试过,可以尝试以下几件事:

调用 glutBitmapCharacter() 之前设置的颜色是什么?如果绘图颜色设置为不显示在背景中的颜色,它可能看起来就像什么都没有被绘制。

除了 glDisable(GL_TEXTURE_2D) 之外,您是否尝试过调用 glDisable(GL_TEXTURE)?

您是否在代码中的其他任何地方启用了照明等其他功能,然后在呈现可能影响事物的文本之前不禁用?当我过去遇到这样的错误时,似乎它们通常与 OpenGL 状态中的某些东西处于我没想到的状态有关,通常是因为我对其他地方的状态进行了一些更改而忘记了撤消它。我建议您尝试系统地注释掉代码中的各种 OpenGL 调用,即使它们看起来并不直接相关,并查看这些字符是否出现过。如果他们这样做了,那么您将知道您需要进行/撤消哪个状态更改。

【讨论】: