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 #define
s enthält, anhand derer Sie Code bedingen können.