2010-11-21 11 views
2

Wenn an den reshape Beispielen im redbook suchen, finde ich in der Regel so etwas wie:Warum enden Umformungscodes in glMatrixMode (GL_MODELVIEW)?

void reshape(int w, int h) 
{ 

    glViewport(0, 0, (GLsizei) w, (GLsizei) h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0); 
    glMatrixMode(GL_MODELVIEW); 

} 

Ich verstehe, dass die Projektionsmatrix durch glLoadIdentity();glMatrixMode(GL_PROJECTION); gefolgt Aufruf zurücksetzt, aber ich verstehe nicht, warum glMatrixMode(GL_MODELVIEW) in der Regel bei der genannt wird Ende der Umgestaltung.

In diesem speziellen Beispiel betrifft glFrustum die Projektionsmatrix, richtig? Warum wird GL_MODELVIEW später aufgerufen? Würde es einen Unterschied machen, wenn der letzte Aufruf an glMatrixMode(GL_MODELVIEW) entfällt?

Antwort

3

Der meiste Rendering-Code wirkt sich auf GL_MODELVIEW aus, da dies die Objektübersetzung und die Kameraposition beeinflusst. Der Größenänderungscode funktioniert jedoch unter GL_PROJECTION. Der Programmierer nimmt wahrscheinlich an, dass die aktuelle Matrix die Modellansicht in den meisten seines Codes ist, und wenn eine andere betroffen sein muss, ändert er/sie die Matrix, aktualisiert sie und ändert dann das Ziel zurück auf GL_MODELVIEW, also den Rest von Der Code zielt nicht auf die falsche Matrix ab.

Im Allgemeinen beeinflussen OpenGL-Funktionen die Matrix, auf die gerade zugegriffen wird, weshalb Sie die Matrix ändern.

+0

Würde es einen Unterschied machen, wenn der letzte Aufruf von glMatrixMode (GL_MODELVIEW) weggelassen wird? – andandandand

+4

Ja - außer du würdest es woanders hinlegen. Grundsätzlich werden die meisten Matrixoperationen in der Modelview-Matrix durchgeführt (die Projektionsmatrix wird nur einmal pro Fenstergröße oder sogar nur einmal pro Lauf erstellt), so dass der Matrixstapel der Modellansicht der aktive Matrixstapel sein soll (dh von allen betroffen) die Matrix ruft). Deshalb lautet der Trend: "Wenn Sie einen anderen Matrix-Stack modifizieren möchten, dann schalten Sie ihn ein, machen Sie Ihre Arbeit und kehren Sie zu Modelview zurück". – Kos

Verwandte Themen