Я прошел через несколько уроков, но до сих пор не понял, как нарисовать 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 (), а затем вытолкнуть две матрицы из стека. Это не сработало. Я устала возиться с нажатием и выталкиванием матриц в случайном порядке.
Если ваш 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 () из функции рендеринга — лучше установить его один раз в начале программы и забыть об этом. Изменения в состоянии дороги, поэтому вы должны избегать их как можно больше.