Opengl рисует 2-мерное наложение на проблему 3D-сцены - PullRequest
9 голосов
/ 25 ноября 2010

У меня настроена движущаяся трехмерная сцена, и я хочу сделать стационарное наложение 2d GUI, которое всегда сверху, когда я пытаюсь сделать 2d формы, я ничего не вижу.Когда я звоню: glMatrixMode (GL_PROJECTION);моя 3d сцена исчезает, и у меня остается пустое окно ...

вот код, который я использую для наложения

РЕДАКТИРОВАТЬ: обновленный код

    glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-100, 100, -100, 100);
glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
glDisable(GL_TEXTURE_2D);
glDisable(GL_LIGHTING);
glColor3f(1, 1, 1);
glPushMatrix();
glBegin(GL_QUADS); 
glVertex3f(-5.0f, 5.0f, 0.0f); 
glVertex3f(-5.0f, -5.0f, 0.0f); 
glVertex3f(5.0f, -5.0f, 0.0f); 
glVertex3f(5.0f, 5.0f, 0.0f); 
glEnd();   
glPopMatrix();
glEnable(GL_DEPTH_TEST);
glutSwapBuffers();

Ответы [ 6 ]

5 голосов
/ 26 ноября 2010

Хм ... Основываясь на фрагменте кода, который вы разместили, я считаю, что ваша сцена исчезает из-за того, что вы делаете с вашими матрицами - выглядит для меня немного хаотично.Подход должен выглядеть следующим образом:

  • очистить экран
  • 3D:
    • включить освещение, z-тест и т. Д.
    • установить активную матрицурежим проецирования
    • загрузка идентификатора и создание перспективной проекции
    • установка режима активной матрицы обратно на просмотр модели
    • рисование всего 3D
  • 2D:
    • отключить освещение, z-тест и т. Д.
    • установить режим активной матрицы на проекцию
    • загрузить идентификатор и установить ортогональную проекцию
    • установить активную матрицурежим назад к просмотру модели
    • рисовать все 2D
  • буферы подкачки

Также рассмотрите возможность переключения на шейдеры (и на современныеВерсия OpenGL в общем) если хочешь сделать свою жизнь еще проще:).

4 голосов
/ 25 ноября 2010

Вы должны нарисовать свой квад в другом порядке. По умолчанию OpenGL использует против часовой стрелки передние многоугольники. Это означает, что вы не видите свой многоугольник, потому что видите только его заднюю поверхность.

Вы можете взглянуть на glFrontFace .

EDIT:

Также, если это не сработает, вы можете попытаться отключить следующие состояния:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-100, 100, -100, 100);
glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
glDisable(GL_BLENDING);
glDisable(GL_TEXTURE_2D);
glDisable(GL_LIGHTING);

Возможно, вы захотите использовать glPushAttrib и glPopAttrib, чтобы не испортить ваше состояние.

3 голосов
/ 20 августа 2012
glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
glDisable(GL_TEXTURE_2D);
glDisable(GL_LIGHTING);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-100, 100, -100, 100);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor3f(1, 1, 1);
glBegin(GL_QUADS); 
    glVertex3f(20.0f, 20.0f, 0.0f); 
    glVertex3f(20.0f, -20.0f, 0.0f); 
    glVertex3f(-20.0f, -20.0f, 0.0f); 
    glVertex3f(-20.0f, 20.0f, 0.0f); 
glEnd();   
/// Now swap buffers
1 голос
/ 03 августа 2012

Убедитесь, что ваша геометрия (в частности, координаты z вашей геометрии в терминах вашего 2d пользовательского интерфейса) больше, чем ближняя плоскость (за ближней плоскостью на оси z), в противном случае любой рендеринг, выполняемый перед ближней плоскости не будет видно. Я предполагаю, что вы определили свою усадьбу вида где-то еще в коде (это где определяется ближняя плоскость).

Если ближняя плоскость равна 0,01f, то ваши определения вершин могут быть

glVertex3f(-5.0f, 5.0f, -0.02f); 
glVertex3f(-5.0f, -5.0f, -0.02f); 
glVertex3f(5.0f, -5.0f, -0.02f); 
glVertex3f(5.0f, 5.0f, -0.02f); 

Я верю в MatrixMode( GL_MODELVIEW ), который вы всегда смотрите на ось -Z. Надеюсь, это поможет.

Возможно, я ошибаюсь, но я думаю, что DEPTH_TEST относится к z-буферизации вашего окончательного визуализированного объекта, я не думаю, что это отключает значение в ближней плоскости.

1 голос
/ 25 ноября 2010

Кроме того, я также использую отдельное FBO для подобных вещей.Обычно оверлей не нужно перерисовывать все время, поэтому визуализируйте его по требованию в FBO и просто визуализируйте как полноэкранный четырехкадровый кадр.Это тратит впустую некоторую скорость заполнения, но в целом я нахожу, что обычно все равно быстрее и делает код намного чище.

0 голосов
/ 25 марта 2015
'    glGetBooleanv(GL_BLEND,        &m_origin_blend);
glGetBooleanv(GL_DEPTH_TEST,&m_origin_depth);
glGetBooleanv(GL_CULL_FACE, &m_origin_cull);

setAlphaBlending(true);
setDepthTest(false);
setCullFace(false); //by stone

//ur draw core()

setAlphaBlending(m_origin_blend>0?true:false);
setDepthTest(m_origin_depth>0?true:false);
setCullFace(m_origin_cull>0?true:false); //by stone
'
...