Opengl: 2d HUD над 3D - PullRequest
       0

Opengl: 2d HUD над 3D

17 голосов
/ 29 марта 2011

Я просмотрел некоторые вопросы, опубликованные здесь по этому вопросу, и до сих пор не могу понять, почему мой 2d HUD появляется, но заставляет мой 3D Rendered мир исчезнуть.

РЕДАКТИРОВАТЬ: Кажется, что 2-я сцена получает контроль над всем экраном, поэтому время от времени я вижу, как 3-я сцена просвечивает сквозь 2-ю сцену.Так что, хотя я только отрисовываю четырехугольник с разрешением 10 x 10 пикселей, он рендерит это, а затем отключает остальную часть экрана.порядок моего кода.Как будто он создает трехмерное пространство, а затем создает 2-мерное пространство, которое, в свою очередь, нейтрализует трехмерное пространство.

Ответы [ 3 ]

35 голосов
/ 29 марта 2011

Потребовалось немного времени, чтобы понять это, так что на случай, если у других возникнут те же проблемы:

    ...After Drawing 3d Stuff...

glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0.0, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0, -1.0, 10.0);
glMatrixMode(GL_MODELVIEW);
//glPushMatrix();        ----Not sure if I need this
glLoadIdentity();
glDisable(GL_CULL_FACE);

glClear(GL_DEPTH_BUFFER_BIT);

glBegin(GL_QUADS);
    glColor3f(1.0f, 0.0f, 0.0);
    glVertex2f(0.0, 0.0);
    glVertex2f(10.0, 0.0);
    glVertex2f(10.0, 10.0);
    glVertex2f(0.0, 10.0);
glEnd();

// Making sure we can render 3d again
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
//glPopMatrix();        ----and this?

...Then swap buffers...

:)

6 голосов
/ 29 марта 2011

Если вы накладываете 2D-орто-проекцию на 3D, вы, как правило, хотите получить буфер глубины из уравнения:

glDepthMask(GL_FALSE);  // disable writes to Z-Buffer
glDisable(GL_DEPTH_TEST);  // disable depth-testing

Конечно, вы захотите сбросить их на исходныезначения перед выполнением следующего 3D-прохода.

2 голосов
/ 14 ноября 2011
glViewport(0, 0, x, y); //You need to do this only once on viewport resize

//Setup for 3D
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(40.0, (GLdouble)x/(GLdouble)y, 0.5, 20.0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity;

glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BIT);

// ... Render 3D ...

//Setup for 2D
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glOrtho(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1, 1);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity;

glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BIT);

// ... Render 2D ...

SwapBuffers;

Обратите внимание на то, что нет необходимости обрабатывать матрицу Push / Pop, если вы полностью визуализируете 2D поверх 3D.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...