2010-11-26 2 views
5

Я работаю над проектом, который требует создания 2D-интерфейса, созданного «сверху» или 3D-мира. На некоторых других форумах я читал, что вы можете использовать «GluOrtho2D()» для задания и вернуться к GluPerspective(), как только вы закончите. Единственное, мой тестовый код, который я написал для него, отображает только 3D-мир, а не 2D-квад. Однако, когда я отключу код 3D-рендеринга, квадрат появляется там, где он должен был быть. Я урезал код только для openGL, который я записал ниже. Код написан на Python с использованием библиотеки Pyglet.Проблема с созданием 2D-интерфейса в 3D-мире openGL


Код инициализации сцены:

glViewport(0, 0, width, height) 
glMatrixMode(GL_PROJECTION) 
glLoadIdentity() 
gluPerspective(60.0, float(width)/height, .1, 10000.) 
glMatrixMode(GL_MODELVIEW) 
glClearDepth(1.0) 
glShadeModel(GL_FLAT) 
glEnable(GL_DEPTH_TEST) 
glDepthFunc(GL_LEQUAL) 
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST) 

Фрейм код рендеринга. Вызов builder.buildMap() создает 3D-сцены, и пара glBegin-glEnd рисует 2D четверной:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT) 
stage.set3DMode(window.width, window.height) 
builder.buildMap() 
stage.set2DMode(window.width, window.height) 
glBegin (GL_QUADS) 
glVertex2i(0, 0) 
glVertex2i(0, 200) 
glVertex2i(200, 200) 
glVertex2i(200, 0) 
glEnd() 

функция stage.set3DMode:

glDisable(GL_DEPTH_TEST) 
glMatrixMode(GL_PROJECTION) 
glLoadIdentity() 
gluOrtho2D(0, width, 0, height) 
glMatrixMode(GL_MODELVIEW) 

и функция stage.set3DMode :

glEnable(GL_DEPTH_TEST) 
glMatrixMode(GL_PROJECTION) 
glLoadIdentity() 
gluPerspective(60.0, float(width)/float(height), .1, 10000.) 
glMatrixMode(GL_MODELVIEW) 

Я действительно надеюсь, что кто-то может указать на мою ошибку! И спасибо за помощь мне :)

ответ

3

Похоже, вы не вызываете glLoadIdentity() после переключения на GL_MODELVIEW. Самый простой способ запомнить - каждый раз, когда вы меняете матрицу проекций, переходите к GL_MODELVIEW и вызываете glLoadIdentity() (если вы действительно не хотите сохранить старый).

+0

Отлично! Это исправило это. Большое спасибо! – Bartvbl

1

Я использую следующие матрицы для 2d рендеринга:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(0, w, h, 0, 0, 1); 
glViewport(0, 0, w, h); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glTranslatef(0.375f, 0.375f, 0); 
2

Многие люди ошибаются, как использовать glViewport и тому подобное. Они всегда помещают его в преобразованный обратный вызов, который просто ошибочен.

Вы всегда будете полностью настроены в своей функции рендеринга, как раз перед тем, как вы будете нуждаться в этих настройках. Так что ваш код должен быть (pesudocode):

render_scene(): 
    // first clear the whole window 
    glViewport(0, 0, window.width, window.height) 
    glClearDepth(1.0) 
    glClearColor(1., 1., 1., 1.); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT) 

    glViewport(3Dstuff.x, 3Dstuff.y, 3Dstuff.w, 3Dstuff.h) 
    // maybe also set scissor to clip 
    glMatrixMode(GL_PROJECTION) 
    glLoadIdentity() 
    gluPerspective(60.0, float(width)/height, .1, 10000.) 
    glMatrixMode(GL_MODELVIEW) 
    setup3DstuffModelview() 
    glDepthFunc(...) 
    glEnable(GL_DEPTH_TEST) 
    // other state stuff 
    render3Dstuff() 

    // now the 2D stuff 
    glViewport(2Dstuff.x, 2Dstuff.y, 2Dstuff.w, 2Dstuff.h) 
    // clear depth and stencil -- if you need parts of the 3D depth/stencil 
    // for some algorithm retain it or save and restore by FBO renderbuffers or 
    // glReadPixels, glDrawPixels 
    glClearDepth(1.0) 
    glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT) 

    glMatrixMode(GL_PROJECTION) 
    glLoadIdentity() 
    glOrtho(...) 
    glMatrixMode(GL_MODELVIEW) 
    glLoadIdentity() 
    setup2DstuffModelview() 
    glDepthFunc(...) 
    glDisable(GL_DEPTH_TEST) 
    // other state stuff 
    render2Dstuff() 

    // repeat for all the layers you need 

Это очень важно: OpenGL это состояние машины. Если вы не можете доказать, что не произошло никаких неопределенных изменений состояния, вы всегда переустанавливаете все состояния, необходимые для рендеринга определенной геометрии.