2010-11-26 11 views
5

Pracuję nad projektem, który wymaga utworzenia interfejsu 2D renderowanego "na wierzchu" lub w świecie 3D. Na niektórych innych forach przeczytałem, że możesz użyć "GluOrtho2D()" dla zadania i powrócić do GluPerspective(), gdy skończysz. Jedyną rzeczą jest to, że mój kod testowy, który napisałem, wyświetla tylko świat 3D, a nie 2D. Kiedy jednak wyłączam kod renderowania 3D, quad pojawia się tam, gdzie powinien. Wyciąłem kod do instrukcji openGL, które zapisałem poniżej. Kod jest napisany w Pythonie przy użyciu biblioteki Pyglet.Problem z tworzeniem interfejsu 2D w świecie 3D OpenGL


Scena kod inicjujący:

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) 

Rama kod renderowania. Wezwanie do builder.buildMap() tworzy scenę 3D, a para glBegin-glEnd rysuje 2D Quad:

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

funkcja stage.set3DMode:

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

a funkcja stage.set3DMode :

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

Naprawdę mam nadzieję, że ktoś może wskazać mój błąd! I dziękuję za pomoc :)

Odpowiedz

3

Wygląda na to, że nie nazywają glLoadIdentity() po włączeniu do GL_MODELVIEW. Najprostszym sposobem na zapamiętanie jest wywołanie go za każdym razem, gdy zmieniasz matrycę projekcji, przełącz na GL_MODELVIEW i wywołaj glLoadIdentity() (chyba, że ​​naprawdę chcesz zachować stary).

+0

Idealny! To naprawiło to. Dziękuję Ci bardzo! – Bartvbl

1

używam następujące matryce 2D rendering:

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

Wiele osób błędnie używa glViewport i tym podobnych. Zawsze umieszczają go w przekształceniu zwrotnym, które jest po prostu błędne.

Zawsze do pełnej konfiguracji w funkcji renderowania, tuż przed potrzebą tych ustawień. Więc twój kod powinien być (pesudokod):

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 

To jest naprawdę ważne: OpenGL jest maszyną stanów. O ile nie można udowodnić, że nie doszło do nieokreślonych zmian stanu, zawsze należy zresetować wszystkie stany, które są potrzebne przed renderowaniem określonej geometrii.