OpenGL深度缓冲区问题

OpenGL深度缓冲区问题,opengl,graphics,depth-buffer,vertex-buffer,Opengl,Graphics,Depth Buffer,Vertex Buffer,在我最近的几个项目中,我一直在使用我在查看一些演示时发现的一些实用程序文件 即一个名为opengl.h的文件-主要用于管理着色器,有点像glew和另一个文件Glu字体 gl_字体是一个类,他们使用顶点缓冲区对象在屏幕上渲染字体 但是,当我在游戏中使用这个来渲染帧率时,它会正确地绘制除skybox之外的所有内容。由于某些原因,如果我不渲染它看起来像的字体,skybox将呈现为白色 以下是我认为最重要的gl_字体类的一些部分: void GLFont::begin() { HWND hWnd

在我最近的几个项目中,我一直在使用我在查看一些演示时发现的一些实用程序文件

即一个名为opengl.h的文件-主要用于管理着色器,有点像glew和另一个文件Glu字体

gl_字体是一个类,他们使用顶点缓冲区对象在屏幕上渲染字体

但是,当我在游戏中使用这个来渲染帧率时,它会正确地绘制除skybox之外的所有内容。由于某些原因,如果我不渲染它看起来像的字体,skybox将呈现为白色

以下是我认为最重要的gl_字体类的一些部分:

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_当前位| GL_照明位)到glPushAttrib(GL_当前_位| GL_照明_位| GL_纹理_位);背景纹理将返回,但字体不会渲染

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();
}
是渲染字体时深度缓冲区的图像,是不渲染字体时的外观

谁能解释一下这个问题吗

任何帮助都将不胜感激

谢谢。

看起来
begin()
glMatrixMode(GL\u MODELVIEW)
之后缺少
glPushMatrix()
。这可能会导致在渲染某些文本时场景渲染不正确

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

没有
glGetError()
报告
GL\u STACK\u UNDERFLOW
错误?

我正在最后渲染文本,所以pushmatrix应该无关紧要,是吗?取决于您是否从头开始每帧创建modelview。无论如何:如果您的
GL\u LIGHTING\u BIT
也出现在
glPopMatrix
中,并且您最后绘制了文本,您确定它通过了深度测试吗?您是否尝试在呈现文本时禁用GL_DEPTH_测试?@DeadMG。他们已经在最近的API中清除了这些混乱,在GL 3和GL 4中没有什么可抱怨的。。。我猜:)@DeadMG,而且那些顽固的CAD软件工程师使用OpenGL真是太糟糕了,尽管OpenGL很可怕!(为什么我们要继续这场圣战…?我们这里有一个问题要回答!)@Kos:这不是关于OGL vs D3D,而是关于PushMatrix的想法很糟糕,根本不应该被考虑。