HUD прорисован, но 3D-сцена OpenGL разочаровывает

Я прошел через несколько уроков, но до сих пор не понял, как нарисовать 2D HUD с 3D-сцена без какого-либо бедствия. Я собрал пример кода из Вот а также Вот и разработал порядок, в котором матрицы должны обрабатываться определенным образом (см. Вот) для достижения именно того, что я поставил перед собой. Я разработал код рендеринга, как показано ниже:

void render()
{
//Clear screen
glClearColor(0.2f, 0.0f, 0.2f, 1.0f); // Clear the background of our window to red
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW); //Switch to the drawing perspective
glLoadIdentity(); //Reset the drawing perspective

// Movement as response to input:
glTranslatef( cam.getEye().getX(), cam.getEye().getY(), cam.getEye().getZ() ); // Translate our object along the y axis
glRotatef( cam.getTheta(), 0.0f, 1.0f, 0.0f ); // Rotate our object around the y axis
// No pushing/popping a matrix and no gluLookAt() used here.

// ==================== Drawing scene here: ======================
// ...
// =================================== HUD: ==================================

glMatrixMode(GL_PROJECTION);

glPushMatrix();
//glPopMatrix();

glLoadIdentity();
gluOrtho2D(0, winW, 0, winH); //left,right,bottom,top
glMatrixMode(GL_MODELVIEW);

//glPushMatrix();
glPopMatrix();
glLoadIdentity();

// drawing the HUD rect here:
glBegin(GL_QUADS);
// ...
glEnd();

glPopMatrix();
glPopMatrix();
//glPushMatrix();
//glPushMatrix();

// ===============================================================================
glutSwapBuffers(); //Send scene to the screen to be shown
}

… но по какой-то причине он отображает только мой темно-голубой HUD, и 3D-сцена просто исчезла. Что я делаю неправильно? Что я пропустил? Я знаю, что должен нажать матрицу проекции, затем матрицу вида модели, затем выполнить glOrtho2D (), а затем вытолкнуть две матрицы из стека. Это не сработало. Я устала возиться с нажатием и выталкиванием матриц в случайном порядке.

0

Решение

Если ваш HUD наложен, как обычно, возможно, вы захотите отключить тест глубины & потенциально глубокие записи перед рисованием содержимого HUD:

glDisable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE);

Таким образом, значение Z HUD не имеет значения. Не забудьте включить перед рисованием сцены.

Как заметили другие, у вас также есть проблемы со стеком матриц. Отдельные стеки связаны с проекцией & матрицы просмотра модели. Прямо сейчас вы толкаете матрицы проекций и выталкиваете матрицы вида модели, так что вы переполняете одну и меньше другой. Вам нужно нажать & поп в том же режиме симметрично. Учитывая, что вы начинаете с glLoadIdentity() в каждом режиме вам может не понадобиться использовать матричные стеки вообще.

РЕДАКТИРОВАТЬ: более прямой ответ

Вот как должен выглядеть ваш код рендеринга:

void render()
{
//Clear screen
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

//*************************************************************************
//* Prepare to render main scene:
//*************************************************************************
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(...);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef( cam.getEye().getX(), cam.getEye().getY(), cam.getEye().getZ() );
glRotatef( cam.getTheta(), 0.0f, 1.0f, 0.0f );

//*************************************************************************
//* Draw Main Scene Here:
//*************************************************************************

// ...//*************************************************************************
//* Prepare to render HUD overlay:
//*************************************************************************
glDisable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(...);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

//*************************************************************************
//* Draw HUD here:
//*************************************************************************

// ...// Finish the frame:
glutSwapBuffers(); //Send scene to the screen to be shown
}

Теперь, так как вы будете корректировать матрицу проекции дважды во время каждого вызова рендеринга, вы должны удалить gluPerspective () из функции resizeWindow (). Кроме того, я удалил вызов glClearColor () из функции рендеринга — лучше установить его один раз в начале программы и забыть об этом. Изменения в состоянии дороги, поэтому вы должны избегать их как можно больше.

3

Другие решения


По вопросам рекламы [email protected]