Frage

Ich arbeite an einem Projekt, das erfordert, dass ich eine 2D-Schnittstelle gemacht „on top“ oder eine 3D-Welt erstellen. Auf einigen anderen Foren habe ich gelesen, dass Sie „gluOrtho2D ()“ für den Job, und Schalter wieder auf gluPerspective (), wenn Sie fertig wurden benutzen konnten. Die einzige Sache ist, mein Test-Code, den ich für sie schrieb nur zeigt die 3D-Welt, nicht die 2D-Quad. Wenn ich den 3D-Rendering-Code zu deaktivieren, jedoch scheint das Quad, wo es eigentlich sein sollte. Ich getrimmt, den Code zu openGL nur Aussagen nach unten, die ich unten notiert haben. Der Code ist in Python geschrieben, um die Pyglet Bibliothek.


Die Szene Initialisierungscode:

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)

Der Rahmen-Rendering-Code. Der Aufruf von builder.buildMap () erzeugt die 3D-Szene und das glBegin-glEnd Paar zieht einen 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()

die stage.set3DMode Funktion:

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

und die stage.set3DMode Funktion:

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

Ich hoffe wirklich, jemand meinen Fehler kann darauf hinweisen! Und vielen Dank für die Hilfe:)

War es hilfreich?

Lösung

Es sieht aus wie Sie rufen Sie nicht glLoadIdentity() nach zu GL_MODELVIEW wechseln. Der einfachste Weg, sich daran zu erinnern ist, nennt es jedes Mal, wenn die Projektionsmatrix zu ändern, wechseln Sie in GL_MODELVIEW und Anruf glLoadIdentity() (es sei denn, Sie wirklich die alten behalten wollen).

Andere Tipps

Eine Menge Leute bekommen es falsch, wie glViewport und dergleichen zu verwenden. Sie legen es immer in dem reshape Rückruf, die einfach falsch ist.

Sie immer auf die volle Setup in Ihrer Rendering-Funktion, kurz bevor müssen Sie diese Einstellungen. So Ihr Code sollte (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

Das ist wirklich wichtig: OpenGL ist eine Zustandsmaschine. Sofern Sie nicht, dass keine unbestimmten Zustand Veränderungen nachweisen können Sie passieren immer wieder- / set alle Staaten müssen Sie vor einer bestimmten Geometrie zu machen.

Ich verwende die folgenden Matrizen für 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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top