Проблема с буфером глубины в OpenGL - PullRequest
2 голосов
/ 05 января 2011

Для моих последних нескольких проектов я использовал некоторые файлы утилит, которые я нашел, просматривая несколько демонстраций здесь .

А именно файл с именем opengl.h - в основном используется для управления шейдерами, похожими на glew, и другим файлом gl_font.

gl_font - это класс, который они используют для визуализации шрифтов на экране, используя объекты буфера вершин.

Однако, когда я использую это для рендеринга частоты кадров в моей игре, он правильно рисует все, кроме скайбокса. По какой-то причине скайбокс отображается белым, как видно здесь , если я не отображаю шрифт, он выглядит как 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();
}

Это - изображение буфера глубины, когда визуализируется шрифт, а это - это то, что выглядит, когда его нет.

Может кто-нибудь пролить свет на эту проблему, пожалуйста?

Любая помощь будет принята с благодарностью!

Спасибо.

1 Ответ

1 голос
/ 05 января 2011

Похоже, begin() не хватает glPushMatrix() после glMatrixMode(GL_MODELVIEW). Это может привести к неправильному отображению сцены, если также отображается некоторый текст.

Не glGetError() сообщил об ошибке GL_STACK_UNDERFLOW?

...