Opengl, нарисовавший 2d-оверлей по проблеме 3d-сцены

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

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

EDIT: обновленный код

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(); 

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

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

РЕДАКТИРОВАТЬ:

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

 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 чтобы не испортить свое состояние.

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

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

Кроме того, подумайте о переходе на шейдеры (и в современную версию OpenGL в целом), если вы хотите сделать свою жизнь еще проще :).

 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 

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

Убедитесь, что ваша geometry (в частности, координаты z вашей геометрии, с точки зрения вашего 2-го интерфейса) больше, чем ближняя плоскость (за ближней плоскостью по оси 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-буферизации вашего окончательного визуализированного объекта, я не думаю, что он отключает значение около плоскости.

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