对于我的最后几个项目,我一直在使用我在查看一些演示here时找到的一些实用程序文件。
即一个名为opengl.h的文件 - 主要用于管理着色器,有点像glew和另一个文件gl_font。
gl_font是一个用于在屏幕上使用顶点缓冲区对象渲染字体的类。
然而,当我使用它来渲染我的游戏中的帧速率时,它会正确地绘制除了天空盒之外的所有内容。由于某种原因,天空盒呈现为here的白色,如果我不渲染字体,它看起来像this。
以下是我认为最重要的gl_font类的一些部分:
void GLFont::begin()
{
HWND hWnd = GetForegroundWindow();
RECT rcClient;
GetClientRect(hWnd, &rcClient);
int w = rcClient.right - rcClient.left;
int h = rcClient.bottom - rcClient.top;
glPushAttrib(GL_CURRENT_BIT | GL_LIGHTING_BIT);
glDisable(GL_LIGHTING);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, m_fontTexture);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0.0f, w, h, 0.0f, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);
drawTextBegin();
}
我已将glPushAttrib(GL_CURRENT_BIT | GL_LIGHTING_BIT);
更改为glPushAttrib(GL_CURRENT_BIT | GL_LIGHTING_BIT | GL_TEXTURE_BIT);并返回背景纹理,但不渲染字体。
void GLFont::end()
{
drawTextEnd();
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glPopAttrib();
}
This是渲染字体时深度缓冲区的图像,而this是不是时的外观。
有人能解释一下这个问题吗?
非常感谢任何帮助!
感谢。
答案 0 :(得分:1)
在begin()
之后看起来glPushMatrix()
缺少glMatrixMode(GL_MODELVIEW)
。这也可能导致在渲染某些文本时错误地渲染场景。
glGetError()
没有报告GL_STACK_UNDERFLOW
错误?