Opengl: 2d HUD над 3D

17

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

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

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(40.0,(GLdouble)x/(GLdouble)y,0.5,20.0);
glMatrixMode(GL_MODELVIEW);
glViewport(0,0,x,y);
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0,-0.5,-6.0);

glPushMatrix();

..Draw some 3d stuff...

glPopMatrix();
// Start 2d
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1, 1);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor3f(0.0f, 255.0f, 1.0f);
glBegin(GL_QUADS);
    glVertex2f(0.0, 0.0);
    glVertex2f(10.0, 0.0);
    glVertex2f(10.0, 10.0);
    glVertex2f(0.0, 10.0);
glEnd();

Затем я заменяю буферы

Вот порядок моего кода. Таким образом, 3D-пространство делает пространство 2d, которое, в свою очередь, отменяет трехмерное пространство.

    
задан Elgoog 29.03.2011 в 04:26
источник
  • В чем разница между SCREEN_WIDTH и x (используется в glViewport)? Если вы прокомментируете последние шесть строк, но оставите 2-D настройку на месте, все-таки исчезнет трехмерная рендеринг? Можете ли вы сузить его до одной строки или команды, которая мешает трехмерной части? –  Ben Voigt 29.03.2011 в 05:51
  • @Ben Voigt: если я прокомментирую последние 6 строк (начиная с glbegin ()), 3D-рендеринг по-прежнему не появляется. SCREEN_WIDTH и X - то же самое, я сделал два vars, не понимая и еще не прибрал его. –  Elgoog 29.03.2011 в 05:58
  • Хорошо, продолжайте комментировать 2-мерный код установки, пока не появится 3-D мир. Либо по одной строке, либо используйте бинарный поиск, чтобы разделить и победить. Вероятно, вы меняете состояние OpenGL, что предполагаемый трехмерный код остался по умолчанию, например текстурирование или шейдер, или что-то в этом роде. –  Ben Voigt 29.03.2011 в 05:59
  • @Ben Voigt: Если я прокомментирую второй glMatrixMode (GL_PROJECTION); 3D-рендеринг –  Elgoog 29.03.2011 в 06:27

3 ответа

35

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

    ...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...

:)     

ответ дан Elgoog 29.03.2011 в 08:50
источник
  • Пожалуйста, введите обратный push-порядок. Вероятно, эти матричные стеки разделены, но это никак не может повредить. Также я думаю, что pushMatrix в этом случае не требуется. –  LumpN 29.03.2011 в 09:28
  • @LumpN: Я не уверен, что вы делаете поп в обратном push-порядке –  Elgoog 29.03.2011 в 09:35
  • Я думаю, что он означает, что пропущенный glPopMatrix () должен идти до сброса матрицы проекта. –  geofftnz 29.03.2011 в 23:40
  • Лучше использовать gluOrtho2D () вместо glOrtho () для 2D HUD. –  Tobias Reich 13.12.2014 в 12:07
  • Кто-нибудь знает, как перейти от освещения в 3D к цветам в 2D? –  Bitterblue 08.12.2016 в 07:52
6

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

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

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

    
ответ дан geofftnz 29.03.2011 в 05:38
источник
1
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.     

ответ дан Kromster 14.11.2011 в 10:28
источник