【问题标题】:Printing to the HUD in NVidia with OpenGL使用 OpenGL 在 NVidia 中打印到 HUD
【发布时间】:2012-12-30 15:31:16
【问题描述】:

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

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

我已将 count 变量放入模拟代码的 .h 文件中,然后将其放入 .cpp 文件中以进行可视化,然后尝试使用 line 提供的 HD 功能将其打印到屏幕上:

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

看了之后,我很快意识到使用该代码我无法访问计数变量。

有谁知道无论如何可以打印到可视屏幕。

编辑:将文本绘制到屏幕上的功能

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

【问题讨论】:

    标签: c++ visual-studio-2010 opengl nvidia


    【解决方案1】:

    这里的第一个问题:

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

    【讨论】:

    • 非常感谢这有助于将数据传输到另一个 cpp,但是它正在将随机符号打印到屏幕上,作为浮点数的姿势。这只是我打印出来的方式吗?
    • @Defterniko:你能告诉我,我在哪里可以找到这个特定 HUD 库的文档?这不是标准的东西,我可以不阅读文档就知道。
    • 一个朋友给了我一个函数,我会在编辑时将它添加到上面的其余部分
    • @Defterniko:请查看我对您提供的功能的修复。
    猜你喜欢
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多