OpenGL深度缓冲问题

时间:2011-01-05 17:56:19

标签: opengl graphics depth-buffer vertex-buffer

对于我的最后几个项目,我一直在使用我在查看一些演示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是不是时的外观。

有人能解释一下这个问题吗?

非常感谢任何帮助!

感谢。

1 个答案:

答案 0 :(得分:1)

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

glGetError()没有报告GL_STACK_UNDERFLOW错误?