Aktualisierung des OpenGL ES 1.1-basierten iPhone-Spiels auf Open GL ES 2.0

7

Ich bin ziemlich neu in allem, was OpenGL im Allgemeinen ist. Ich habe ein OpenGL ES 1.1-basiertes 2D-iPhone-Spiel erstellt, indem ich anhand des Beispielcodes gearbeitet habe. Ich habe den Eindruck, dass OpenGL ES 2.0 sich wesentlich von 1.1 unterscheidet. Was bedeutet die Aktualisierung von 1.1-Code auf 2.0?

Ich bin an das grundlegende Zeichnungsmuster "Matrix drücken, übersetzen, drehen, 2D-Textur zeichnen, Pop-Matrix zeichnen" gewöhnt. Was ist das "Äquivalent" in 2.0?

MrDatabase
quelle

Antworten:

9

OpenGL ES 2.0 unterscheidet sich stark von ES 1.1. Sie haben keine Pipeline mit festen Funktionen mehr, sodass Ihre vertraute "Push-Matrix, Übersetzen, Drehen" usw. nicht mehr vorhanden sind.

Stattdessen haben Sie das Konzept der Shader: Scheitelpunkt und Fragment. Es sind kleine Programme, die für jeden Scheitelpunkt und jedes Pixel ausgeführt werden. Hier finden alle Transformationen und anderen Effekte statt. Ihr Code bereitet die Scheitelpunktdaten vor, teilt OpenGL mit, wie sie strukturiert sind, und übergibt sie den Shadern.

Aber nicht alles ist verloren: Einige Teile von OpenGL haben sich nicht geändert, z. B. das Festlegen verschiedener Zustände (Mischmodi, Tiefenvergleiche) oder das Erstellen von Texturen.

Um OpenGL ES 2.0 effektiv nutzen zu können, müssen Sie die Grundlagen der 3D-Computergrafik beherrschen. Besorgen Sie sich also ein gutes Einführungsbuch und lernen Sie die Prinzipien. Anschließend können Sie zu OpenGL ES 2.0 wechseln und mit dem Schreiben von Shadern beginnen. Dies ist ein gutes OpenGL ES 2.0-Buch .

Schließlich nicht davon ausgehen , Sie haben auf OpenGL ES 2.0 zu bewegen. Sofern Sie in ES 1.1 nichts Spezielles benötigen, das Sie nicht tun können, können Sie ES 1.1 weiterhin verwenden, da neuere Geräte alle abwärtskompatibel sind.

Noel Llopis
quelle
2
Push-Matrix, Übersetzen, Drehen usw. sind noch vorhanden. Es ist die Zeichnung im Sofortmodus, die weg ist. Also nicht mehr glVertex () glNormal () usw. Sie müssen stattdessen Scheitelpunktarrays oder Scheitelpunktpufferobjekte verwenden, um Ihre Geometrie auf die Karte zu bringen.
Bob Somers
3
@ Bob Somers Ich bin mir ziemlich sicher, dass der Matrixstapel in OpenGL 2.0 ES auf dem iPhone entfernt wurde, also gibt es keine Push-Matrix, keine Übersetzung usw.
5ound
Hmm, ich muss zugeben, dass ich nicht 100% sicher bin, da ich OpenGL für Handys wirklich nicht so oft mache und definitiv nicht für iPhone. Ich würde allerdings denken, dass der Matrixstapel da sein muss. Wie würden Sie Geometrie ohne sie instanziieren?
Bob Somers
@ Bob Ihr Kommentar wäre korrekt, wenn Sie OpenGL ES 1.1 mit OpenGL 1.5 vergleichen würden. ES 2.0 ist ein völlig anderes Biest und die Matrixoperationen sind tatsächlich weg. Natürlich gibt es viele Orte, an denen Sie eine Bibliothek mit C ++ - Matrixklassen abrufen können.
U62
@ Bob Somers: Sie instanziieren Geometrie, indem Sie Matrixuniformen, die Sie selbst berechnet haben, an Vertex-Shader übergeben (die sogenannte Modellansichtsmatrix).
Bahbar
7

Ich habe meine 3D Engine von OpenGL ES 1.X auf OpenGL ES 2.X portiert, weil ich Shader liebe. Die Renderer sind unterschiedlich und teilen keinen Code.

Sie können leicht übersetzen:

  • Texturenverwaltung
  • Framebuffer-Objekte
  • mischen

Schwieriger (Need Shader):

  • feste Pipeline-Transformationen (Rotation, Skalierung ...)
  • Nebel
  • Beleuchtung

Um Ihren Code zu portieren, empfehle ich Ihnen:

Schritt eins

  • Lernen Sie GLSL 1.2: Sie können WebGL-Tutorials lesen
  • versuche ein paar Shader Shader Spielzeug zu schreiben

Schritt zwei

  • liste alles Material auf, das du hast (oder Rendering-Techniken)
  • Listen Sie alle Scheitelpunktinformationen als Scheitelpunktkoordinaten, Normalen, Texturenkoordinaten und Farbinformationen auf, die Sie für jedes Material benötigen

    Mit diesen Informationen wissen Sie, welche GLSL-Programme (Vertex + Fragment Shader) Sie schreiben müssen.

Schritt drei

  • Schreiben Sie Ihre Shader-Kompilierungsfunktionen und protokollieren Sie alle Informationen
  • Implementieren Sie ein Minimalprogramm OpenGL ES 2.X mit einem Quad (zwei Dreiecke).
  • Implementieren und testen Sie Ihre GLSL-Programme nacheinander

Schritt vier: Optimieren

Ellis
quelle
3

OpenGL ES 2.0 ist keine neue Version von OpenGL ES 1.1. Mit anderen Worten, OpenGL ES 2.0 ist kein besseres OpenGL ES 1.1.
Nun nein duh, sie haben alles verändert.

Der Import dieser einfachen Aussage ist leicht zu übersehen. Bedenken Sie:
OpenGl 2.0 ist eine neue Version von OpenGL 1.5. OpenGL 2.0 ist ein besseres OpenGL 1.5.

Dies bedeutet, wenn Sie OpenGl 1.5 verwenden und die Vorwärtskompatibilität beibehalten möchten, sollten Sie auf 2.0 umsteigen.

Gleiches gilt nicht für OpenGL ES. 1.1 wurde nicht durch 2.0 ersetzt. Sie sind unterschiedliche Standards. Die Verwirrung hätte beseitigt werden können, wenn sie benannt worden wären:

  • OpenGL ES behoben
  • OpenGL ES Shader

HINWEIS: Technisch gesehen ist dies nicht ganz richtig. Der Grund dafür ist, dass Sie die 1.0-Serie mit der 2.0-Serie implementieren können. Sie müssten nur die festen Pipeline-Funktionen als Shader festlegen.

deft_code
quelle
2

Neben den anderen Antworten hier habe ich kürzlich gles2-bc gefunden, eine C ++ - Bibliothek, die die nicht abwärtskompatible OpenGL ES 2.0-API abwärtskompatibel macht.

Es gibt einige bekannte Einschränkungen und ich habe sie selbst nicht verwendet, dachte aber, ich würde den Link als Referenz posten.

http://code.google.com/p/gles2-bc/

Cameron Yule
quelle