c++ - 使用 OpenGL 打印到 NVidia 中的 HUD

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

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

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

我已将计数变量放入模拟代码的 .h 文件中,然后在可视化的 .cpp 文件中删除它,然后尝试使用行提供的 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);

最佳答案

这里的第一个问题:

I have put the count variable in the .h file for the simulation code and then retireved it in the .cpp file for the visualisation and then tried to print it to screen using the HD function provided with line

请自行了解变量范围和编译单元。为了立即缓解,将头文件 (.h) 中的变量声明更改为 extern,没有赋值,并且在编译单元源文件之一 (.c*) 中) 实际上定义变量,理想情况下带有初始化赋值。

Does anyone know how in anyway it is possible to print to the visual screen as i can't find any help online that works.

切换到符合您的 HUD 需求的投影,并在您的场景上绘制乐谱。您可以随时随地切换投影和视口(viewport)。专业提示:如果您在窗口的调整大小处理程序中有任何处理投影矩阵的代码,请将其移动到绘图代码中。

因评论而更新

让我评论一下 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);

此处的问题:正交投影的范围应与视口(viewport)大小相匹配。在这里他们没有。

    glMatrixMode(GL_MODELVIEW);

以下 glLoadIdentity 将破坏模型 View 矩阵,因为它不在推/弹出框架内。也是多余的

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

关于c++ - 使用 OpenGL 打印到 NVidia 中的 HUD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14091957/

相关文章:

c++ - 如何从不同程序的窗口获取窗口位置/大小?

C++:对右值的 const 引用

c++ - 不相关类型之间的 reinterpret_cast 和 virtual

c++ - 这个数组拷贝是如何工作的?

visual-studio-2010 - OpenCV 2.3.1 安装,VS 2010,MEX

OpenGL:尽管透明度设置为 1.0,但仍能看到对象的内部

C# 多线程 - 为什么 2 个线程调用同一个函数?

visual-studio-2010 - 查找VS2012项目中有多少行代码

linux - 如何判断我的显卡在 Linux 上支持哪个版本的 OpenGL

java - 平均法线结果为零长度 vector