这里的第一个问题:
我已将 count 变量放入模拟代码的 .h 文件中,然后将其放入 .cpp 文件中以进行可视化,然后尝试使用 line 提供的 HD 函数将其打印到屏幕上
请了解变量范围和编译单元。为了立即缓解,将头.h
文件 () 中的变量声明更改为 extern,无需赋值,并且在其中一个编译单元源文件 ( .c*
) 中实际定义变量,理想情况下使用初始化赋值。
有谁知道无论如何可以打印到可视屏幕,因为我在网上找不到任何有效的帮助。
切换到符合您的 HUD 需求的投影,并在您的场景上绘制分数。您可以随时随地切换投影和视口。专业提示:如果您在窗口的调整大小处理程序中有任何处理投影矩阵的代码,请将其移动到绘图代码中。
因评论而更新
让我评论一下这个drawText
功能
void drawText(float *text, int length, int x, int y)
{
glMatrixMode(GL_PROJECTION);
double *matrix = new double[16];
glGetDoublev(GL_PROJECTION_MATRIX, matrix);
这实际上是有道理的,因为投影矩阵 stap 的嵌套深度可能不足以使用 glPushMatrix/glPopMatrix。但在函数结束时,它错过了释放分配的内存。事实上,使用静态分配的数组更好。元素的数量是众所周知的,并且获取堆栈的内存比在堆上更有效。
glLoadIdentity();
glOrtho(0, 800, 0, 600, -5, 5);
这里的问题:正交投影的范围应该与视口大小相匹配。在这里他们没有。
glMatrixMode(GL_MODELVIEW);
以下 glLoadIdentity 将丢弃模型视图矩阵,因为它不在推送/弹出框架内。也是多余的
glLoadIdentity();
以下是需要的。
glPushMatrix();
glLoadIdentity();
这里的问题是,glRasterPos 的行为就像发射一个顶点,即它被剪裁(我们对此无能为力)并进行深度测试。glutBitmapCharacter(实际上是glBitmap)可能会干扰深度缓冲区。
glRasterPos2i(x, y);
for(int i=0; i<length; i++)
{
glutBitmapCharacter(GLUT_BITMAP_9_BY_15, (int)text[i]);
}
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glLoadMatrixd(matrix);
glMatrixMode(GL_MODELVIEW);
}
该功能可以固定如下:
void drawText(float *text, int length, int x, int y)
{
double old_modelview[16];
int viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);
glMatrixMode(GL_PROJECTION);
glGetDoublev(GL_PROJECTION_MATRIX, old_modelview);
glLoadIdentity();
glOrtho(viewport[0], viewport[0]+viewport[2],
viewport[1], viewport[1]+viewport[3],
-1, 1);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
// We're using glBitmap, i.e. legacy functionality anyway
// so we can use glPush/PopAttrib as well.
glPushAttrib(GL_DEPTH_BUFFER_BIT);
glDisable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE);
glRasterPos2i(x, y);
for(int i=0; i<length; i++) {
glutBitmapCharacter(GLUT_BITMAP_9_BY_15, (int)text[i]);
}
glPopAttrib(GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadMatrixd(old_modelview);
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
}