it-swarm.com.de

OpenGL vs OpenGL ES 2.0 - Kann eine OpenGL-Anwendung einfach portiert werden?

Ich arbeite an einer Art Spielesystem und bin ein Neuling in OpenGL. Die meisten Bücher scheinen keine sehr klare Antwort auf diese Frage zu geben. Ich möchte mit OpenGL auf meinem Desktop entwickeln, den Code aber in einer OpenGL ES 2.0-Umgebung ausführen. Meine Frage ist dann zweifach:

  1. Wenn ich mein Framework für OpenGL auf dem Desktop ausrichte, wird es in einer OpenGL ES 2.0-Umgebung nur ohne Änderung ausgeführt?
  2. Wenn nicht, dann gibt es einen guten Emulator, PC oder Mac. Gibt es ein Skript, das ich ausführen kann, um meinen OpenGL-Code in OpenGL ES-Code umzuwandeln oder Dinge zu kennzeichnen, die nicht funktionieren?
42
Heat Miser

Es ist ungefähr drei Jahre her, seit ich das letzte Mal ES-Arbeiten durchgeführt habe, daher bin ich möglicherweise nicht mehr auf dem neuesten Stand oder erinnere mich einfach an einige Dinge, die falsch sind.

  1. Nein, das Targeting von OpenGL für den Desktop entspricht nicht dem Targeting von OpenGL ES, da ES eine Teilmenge ist. ES implementiert keine Funktionen im Sofortmodus (glBegin()/glEnd(), glVertex*(), ...) Vertex-Arrays sind die Hauptmethode zum Senden von Inhalten in die Pipeline.

    Darüber hinaus hängt es von dem Profil ab, auf das Sie abzielen: Zumindest im Lite-Profil muss ES keine Gleitkommafunktionen implementieren. Stattdessen erhalten Sie Festkommafunktionen. Stellen Sie sich 32-Bit-Ganzzahlen vor, bei denen die ersten 16 Bits für die Nachkommastellen stehen und die folgenden 16 Bits für die Nachkommastellen.

    Mit anderen Worten, selbst einfacher Code kann nicht portierbar sein, wenn er Floats verwendet (Sie müssten Aufrufe von gl*f() -Funktionen durch Aufrufe von gl*x() -Funktionen ersetzen).

    Wie Sie dieses Problem lösen können, erfahren Sie in Trolltechs Beispiel (speziell in der qtwidget.cpp -Datei; es ist ein Qt-Beispiel, aber immer noch ...). Sie werden sehen, dass sie diesen Anruf tätigen:

    q_glClearColor(f2vt(0.1f), f2vt(0.1f), f2vt(0.2f), f2vt(1.0f));

    Dies soll den Aufruf von glClearColorf () ersetzen. Darüber hinaus verwenden sie das Makro f2vt() - dh float to vertex type , das das Argument automatisch von float in den richtigen Datentyp konvertiert.

  2. Während ich vor drei Jahren einige kleine Demos für ein Unternehmen entwickelte, hatte ich Erfolg mit PowerVRs SDK . Es ist für Visual C++ unter Windows; Ich habe es nicht unter Linux ausprobiert (keine Notwendigkeit, da ich an einem Firmen-PC gearbeitet habe).


Ein kleines Update, das meine jüngsten Erfahrungen mit ES widerspiegelt. (7. Juni 2011)

  • Heutige Plattformen verwenden wahrscheinlich nicht das Lite-Profil, sodass Sie sich wahrscheinlich nicht um Festkommadezimalstellen kümmern müssen
  • Wenn Sie Ihren Desktop-Code für Handys (z. B. iOS) portieren, müssen Sie höchstwahrscheinlich in erster Linie diese und nicht viele andere Schritte ausführen:
    • ersetzen Sie glBegin()/glEnd() durch Vertex-Arrays
    • ersetzen Sie einige Aufrufe von Funktionen wie glClearColor() durch Aufrufe wie glClearColorf()
    • schreiben Sie Ihr Fenster- und Eingabesystem neu
    • wenn Sie auf OpenGL ES 2.0 abzielen, um Shader-Funktionalität zu erhalten, werden Sie es jetzt tun haben das eingebaute Verhalten von Pipelines mit festen Funktionen vollständig durch Shader zu ersetzen - zumindest die grundlegenden, die Pipelines mit festen Funktionen neu implementieren
  • Wirklich wichtig: Wenn Ihr mobiles System nicht über eine begrenzte Speicherkapazität verfügt, sollten Sie die Verwendung der Texturkomprimierung für Ihren Grafikchip genauer untersuchen. Auf iOS-Geräten laden Sie beispielsweise PVRTC-komprimierte Daten auf den Chip hoch
40
Ivan Vučica

In OpenGL ES 2.0, das von neuen Gadgets verwendet wird, müssen Sie auch eigene Scheitelpunkte für Scheitelpunkte und Fragmente angeben, da die alte Pipeline mit fester Funktion weg ist. Dies bedeutet, dass Sie selbst Schattierungsberechnungen usw. durchführen müssen, was sehr komplex wäre. Sie können jedoch vorhandene Implementierungen in GLSL-Tutorials finden.

Da GLES eine Teilmenge von Desktop-OpenGL ist, ist es möglich, dasselbe Programm auf beiden Plattformen auszuführen.

4
Tronic

Ich kenne zwei Projekte, um GL Übersetzung zwischen Desktop und ES bereitzustellen:

  • glshim : Umfangreiche feste Pipeline für 1.x-Unterstützung, grundlegende ES 2.x-Unterstützung.

  • Regal : Alles zu ES 2.x.

3
lunixbochs

Nach meinem Verständnis ist OpenGL ES eine Teilmenge von OpenGL. Ich denke, wenn Sie keine Modi im Direktmodus verwenden, wie glBegin () und glEnd (), sollten Sie in Ordnung sein. Ich habe in den letzten Monaten nicht viel mit OpenGL gearbeitet, aber als ich mit ES 1.0 gearbeitet habe, solange ich glBegin/glEnd nicht verwendet habe, funktionierte alles, was ich mit dem Standard-OpenGL gelernt hatte. 

Ich weiß, dass der iPhone-Simulator OpenGL ES-Code ausführt. Ich bin mir nicht sicher über das Android-Gerät. 

Hier ist Windows Emulator.

3
Ronald

Option 3) Sie können eine Bibliothek wie Qt verwenden, um Ihren OpenGL-Code mithilfe der integrierten Wrapper-Funktionen zu verarbeiten. Dadurch haben Sie die Möglichkeit, eine Codebasis (oder minimal andere Codebasis) für OpenGL zu verwenden und für die meisten Plattformen, die Sie möchten, zu bauen. Sie müssen es nicht für jede andere Plattform portieren, die Sie unterstützen möchten. Qt kann sogar den OpenGL-Kontext basierend auf den von Ihnen verwendeten Funktionen auswählen. 

0
steventaitinger