2

我一直在尝试向我的 OpenGL/C++ 项目中添加一些基本的类似 HUD 的文本。

因此我决定

glutBitmapCharacter( type, character) 

成为我的首选武器。

我意识到,为了最简单的使用,我应该将 2D 矩阵附加到我之前的渲染区域。

glPushMatrix();
glLoadIdentity();
gluOrtho2D(0, 10, 0, 10);

这应该给我一个可爱的 10*10 2D 立方体来玩。

现在,当 glutBitmapCharacter 记住他的最后一个字符位置以附加下一个字符时,就会出现问题。它在写字符串时非常聪明,它显然会记住这个位置,并让我的文本在屏幕上飞过一次 :) 淘气。

glRasterPos2f(x,y);

应该 - 正如我所听到的 - 重置这个东西是正常的 - (虽然我不完全理解为什么 gl 函数控制 glu 函数,但这只是一个旁注)。

现在发生的奇怪事情是,一旦我运行代码:

glPushMatrix();
glLoadIdentity();
gluOrtho2D(0, 10, 0, 10);

string message ="mmh... Pie...";
float poss[3];

glRasterPos3f(0.0, 0.0, 0.0);
glGetFloatv(GL_CURRENT_RASTER_POSITION, poss);
std::cout<< "X" <<(GLfloat) poss[0] << " Y"<<poss[1] << " Z"<<poss[2] <<  std::endl;

   for( size_t i = 0; i < message.size(); ++i ) {
    glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, message[i]);
    }
glPopMatrix();

我的文字没有显示。事实上,由此产生的 X、Y 和 Z(甚至不确定 Z 是否必要......无论如何都应该为 0)都是 inf(无限)。如果我不设置自己的 glRasterPos,除了离开屏幕之外,一切都会正常进行。我的返回位置是向上计数的 X 和 0 , 0 - 正如预期的那样。

那么这是怎么回事,我到底做错了什么?

4

1 回答 1

0

您产生了一个重大的分段错误:glGetFloatv(GL_CURRENT_RASTER_POSITION, poss) 返回 4 个值,因此您必须使用:

float poss[4];

除此之外,您的代码在我的机器上运行良好并返回:

X0 Y0 Z0.5

因此,错误似乎不在您在此处发布的代码中。您应该尝试将其复制到一个基本的“HelloWorld”-GL 程序中,看看它是否在那里工作。请注意,某些 OpenGL 命令仅在初始化有效的绘图表面后才起作用 - 我猜你这样做了?

于 2013-02-12T20:20:51.390 回答