32 Stimmen

Unterschiede zwischen GLSL und GLSL ES 2

Zwei Fragen wirklich...

  1. Ist GLSL ES 2 eine völlig separate Sprache oder eine spezielle Version von GLSL?
  2. Was sind die Unterschiede zwischen ihnen in Bezug auf "Standardbibliothek" Funktionen, Syntax und Möglichkeiten?

Ich schreibe Shader für eine Anwendung, die für Windows, Mac und iPad entwickelt wurde, und würde es vorziehen, nicht mehr Versionen jedes Shaders hinzufügen zu müssen - nun ja, einfachere Shader sowieso.

28voto

Nicol Bolas Punkte 409659

Ist GLSL ES 2 eine völlig separate Sprache oder eine spezielle Version von GLSL?

Jede Version von GLSL ist letztendlich eine "völlig separate Sprache"; einige sind nicht einmal abwärtskompatibel mit früheren Versionen. Die ES-Variante von GLSL ist jedoch noch mehr.

Denken Sie an sie als eine Abspaltung von Desktop-GLSL. Eine Abspaltung von GLSL von sechs Versionen zuvor, beachten Sie.

Was sind die Unterschiede zwischen ihnen hinsichtlich "Standardbibliotheks" Funktionen, Syntax und Fähigkeiten?

Zwischen welchen Versionen?

Der einzige mögliche Grund, warum Sie versuchen könnten, Shader zwischen diesen Plattformen zu teilen, ist, wenn Sie versuchen, OpenGL-Code zwischen ihnen zu teilen. Sie würden sich also auf die Funktionalität von Desktop OpenGL 2.1 beschränken.

Das bedeutet, dass Sie Desktop-GLSL-Version 1.20 verwenden würden. Dies ähnelt GLSL-ES-Version 1.00 (die Version von GLSL hat nicht die gleiche Nummer wie die entsprechende GL-Version. Gut, bis Desktop-GL 3.3/4.0 und GLSL 3.30/4.00), ist aber dennoch anders. In ES haben Sie viele Genauigkeitsqualifikatoren, die Desktop-GLSL 1.20 nicht verarbeiten kann.

Der beste Weg, damit umzugehen, ist die Verwendung eines "Präambel"-Shader-Strings. Sehen Sie, glShaderSource verwendet mehrere Shader-Strings, die zusammengefügt und als einer kompiliert werden. Sie können Ihren Haupt-Shader-String (main und seinen verschiedenen Code, attribute Definitionen, uniforms, usw.) nehmen und einen "Präambel"-Shader-String davor setzen. Der Präambel würde je nachdem, für was Sie kompilieren, unterschiedlich sein.

Ihr ES-GLSL-1.00-Präambel würde so aussehen:

#version 100  //Muss mit einem Versionshinweis beginnen.

Ihr Desktop-GLSL-1.20-Präambel würde so aussehen:

#version 120
#define lowp
#define mediump
#define highp

Und vielleicht noch ein paar andere wohlüberlegte #defines. Auf diese Weise kann Ihr Shader diese Genauigkeitsqualifikatoren haben, und sie werden einfach weggedefiniert, wenn Desktop-GLSL verwendet wird.

Dies ähnelt sehr dem plattformneutralen Codieren in C/C++, wo Sie oft einen plattformspezifischen Header haben, der die Definition ändert und/oder #defines enthält, anhand derer Sie Code bedingen können.

0voto

In einfacheren Worten wurde Opengl ES, d.h. Opengl Embedded System, für die Verwendung auf eingebetteten Geräten wie Mobiltelefonen entwickelt. Das Mobiltelefonsystem hat mit denselben Problemen zu kämpfen wie PCs der 90er Jahre, nämlich Rechenproblemen und Unterschieden in der GPU-Architektur.

  • ImgTech PowerVR SGX - TBDR (TileBasedDeferred)
  • ImgTech PowerVR MBX - TBDR (Feste Funktion)
  • ARM Mali - Geteilt (kleine Kacheln)
  • Qualcomm Adreno - Geteilt (große Kacheln)
  • Adreno3xx - kann auf traditionell umschalten
  • glHint(GL_BINNING_CONTROL_HINT_QCOM, GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM) NVIDIA Tegra - Traditionell

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X