在NVidia中使用OpenGL打印到HUD
Printing to the HUD in NVidia with OpenGL
我发现很难弄清楚如何让我的分数出现在屏幕上。我目前让它工作并打印到控制台窗口,但仅此而已。
当球击中盒子时,计数增加一个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();
}
- 如何循环打印顶点结构
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 如何在c++中打印目录
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 在线编译器中的分段C++没有打印消息
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 如何将结构插入到集合中并打印集合的成员
- 在循环C++中指定字符串之后,不会打印该字符串
- 以螺旋方式打印矩阵的程序.(工作不好)
- 从控制台中删除最后打印的元素
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 如何仅使用对象名称打印特定于对象的成员
- 回溯C++不打印函数,因此文件
- 在一定长度后从数组中打印时缺少整数
- 为什么这个 c++ 代码打印出长度 5,当我打印出字符串时,程序会自动终止?
- 在gem5中打印文件中的所有cache_blocks
- 打印数字图案
- Log4cpp:以UTC/GMT时区打印日期
- 在NVidia中使用OpenGL打印到HUD