2011-01-05 168 views
2

对于我最近的几个项目,我一直在使用我发现的一些实用程序文件,同时查看一些演示hereOpenGL深度缓冲区问题

即一个名为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是什么样子时,它不是。

请问谁能解释一下这个问题?

任何帮助将不胜感激!

谢谢。

回答

1

看起来像begin()glMatrixMode(GL_MODELVIEW)之后缺少glPushMatrix()。这可能会导致场景在渲染某些文本时呈现错误。

没有glGetError()举报GL_STACK_UNDERFLOW错误?

+0

我最后呈现文本,所以pushmatrix应该不重要吗? – henryprescott 2011-01-05 18:48:43

+0

上帝保佑Direct3D。 – Puppy 2011-01-05 18:53:56

+0

取决于您是否从头开始创建模型视图。无论如何:如果'glPopMatrix'中还有'GL_LIGHTING_BIT',并且最后绘制文本,您确定它通过了深度测试吗?您是否尝试在呈现文本的时候禁用GL_DEPTH_TEST? – Kos 2011-01-05 18:59:16