2

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

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

gl_font 是他们用来使用顶点缓冲区对象在屏幕上渲染字体的类。

但是,当我使用它在我的游戏中渲染帧速率时,它会正确绘制除天空盒之外的所有内容。由于某种原因,天空盒呈现为白色,如此处所示如果我不呈现字体,它看起来像这样

以下是我认为最重要的 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();
}

是渲染字体时深度缓冲区的图像,是未渲染时的样子。

任何人都可以阐明这个问题吗?

任何帮助将非常感激!

谢谢。

4

1 回答 1

1

看起来begin()缺少一个glPushMatrix()后缀glMatrixMode(GL_MODELVIEW)。当某些文本也被渲染时,这可能会导致场景渲染不正确。

没有glGetError()报错GL_STACK_UNDERFLOW

于 2011-01-05T18:45:46.867 回答