在NVidia中使用OpenGL打印到HUD

Printing to the HUD in NVidia with OpenGL

本文关键字:打印 HUD OpenGL NVidia      更新时间:2023-10-16

我发现很难弄清楚如何让我的分数出现在屏幕上。我目前让它工作并打印到控制台窗口,但仅此而已。

当球击中盒子时,计数增加一个NX_NOTIFY_ON_TOUCH事件,并在更新功能期间打印在控制台窗口中。

我将计数变量放在模拟代码的。h文件中,然后将其恢复到。cpp文件中用于可视化,然后尝试使用行提供的高清函数将其打印到屏幕上:

 hud.AddDisplayString("Hit Count = ",0.0f,0.89f);
看了

之后,我很快意识到使用这段代码我无法访问for count变量。

有谁知道如何以任何方式打印到可视屏幕上。

EDIT:将文本绘制到屏幕的功能

void drawText(float *text, int length, int x, int y)
{
glMatrixMode(GL_PROJECTION);
double *matrix = new double[16];
glGetDoublev(GL_PROJECTION_MATRIX, matrix);
glLoadIdentity();
glOrtho(0, 800, 0, 600, -5, 5);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
glLoadIdentity();
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);
}

,然后在显示功能中我写:

glColor3f(5,5,5);
drawText(&HITcount, HITcount, 0 , 535);

第一个问题:

我把计数变量放在模拟代码的。h文件中,然后在。cpp文件中恢复它用于可视化,然后尝试使用

行提供的高清函数将其打印到屏幕上

请自己了解变量作用域和编译单元。为了立即缓解,将头文件(.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);

这实际上是有意义的,因为投影矩阵栈可能嵌套不够深,无法使用glPushMatrix/glPopMatrix。但是在函数结束时,它没有释放已分配的内存。实际上,使用静态分配的数组更好。元素的数量是众所周知的,从堆栈中获取内存比从堆中获取内存要有效得多。

    glLoadIdentity();
    glOrtho(0, 800, 0, 600, -5, 5);

这里的问题:正交投影的范围应该匹配视口大小。这里没有。

    glMatrixMode(GL_MODELVIEW);

下面的glloadiidentity将丢弃模型视图矩阵,因为它不在push/pop框架内。也是多余的

    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();
}