OpenGL ES 2.0: Mischen von 2D mit 3D

7

Ist es möglich, 2D- und 3D-Grafiken in einem einzigen OpenGL ES 2.0-Spiel zu mischen?

Ich habe viele 2D-Grafiken in meinem Spiel. Die 2D-Grafik wird durch zwei dreieckige Polygone (die ein Rechteck bilden) mit einer Textur darauf dargestellt. Ich verwende eine orthografische Matrix, um die gesamte Szene zu rendern.

Ich muss meinem Spiel jedoch einige 3D-Effekte hinzufügen. Daher möchte ich eine perspektivische Kamera verwenden, um die Netze zu rendern.

Ist es möglich, orthografische und perspektivische Kamera in einer Szene zu mischen ? Wenn ja, entstehen hierfür hohe Leistungskosten? Gibt es einen empfohlenen Ansatz, um dies effektiv zu tun? Ich werde 90% der 2D-Grafiken und nur 10% der 3D-Grafiken haben.

Zielplattform ist OpenGL ES 2.0 (iOS, Android). Ich benutze C ++ zum Entwickeln.

Vielen Dank.

Bunkai.Satori
quelle
Das falsche OpenG-Tag wurde für Sie behoben. :)
ChrisE

Antworten:

10

Dies ist einfach zu bewerkstelligen.

Setzen Sie die Ansichtstransformation für das 2D-Material auf orthografisch und rendern Sie sie. Zeichnen Sie dann vor dem Löschen des Framebuffers die Effekte mit einer perspektivischen Projektion. Die Projektion wirkt sich nur auf die danach gezeichnete Geometrie aus. Stellen Sie daher vor dem Zeichnen den gewünschten Modus ein.

Dies ist die gleiche Art und Weise, wie wir mit HUDs in unseren FPS umgehen. :) :)

Die einzige Auswirkung auf die Leistung besteht darin, dass Sie eine einheitliche Variable (Ihre Projektmatrix) ändern, oder? Versuchen Sie also einfach, Dinge zu stapeln, um Statusänderungen zu minimieren - das gleiche alte Zeug.

ChrisE
quelle
1
+1 für eine gute Antwort. Ich denke, die Frage wurde klar beantwortet und gab mir solide Informationen, um selbst zu experimentieren. Ich markiere dies als die akzeptierte Antwort .
Bunkai.Satori
1

Wenn Sie die orthografische und perspektivische Projektionsmatrix bei jedem Rendern in den Bildspeicher berechnen, wird die Leistung nur geringfügig beeinträchtigt. Ich schlage vor, sie in einer Variablen zwischenzuspeichern, sie einmal im Initialisierungscode zu berechnen und zu speichern und dann glLoadMatrixzum Laden der Matrix zu verwenden. Die Rendering-Methode würde im Pseudocode folgendermaßen aussehen:

// Draw 3D things first
glMatrixMode(GL_PROJECTION);
glLoadMatrix(perspective_projection_matrix);
glMatrixMode(GL_MODELVIEW);
Draw3DObjects();
// Draw 2D things second
glMatrixMode(GL_PROJECTION);
glLoadMatrix(orthographics_projection_matrix);
glMatrixMode(GL_MODELVIEW);
Draw2DObjects();
Oskar
quelle
In OpenGL ES gibt es weder glMatrixMode noch glLoadMatrix. Alle CPU-basierten Matrixroutinen wurden entfernt. Sie können das Äquivalent tun, aber Sie müssten es selbst rollen.
John Meacham