2012-07-11 13 views
5

Ich möchte die gleiche Shader-Quelle für OpenGL ES und OpenGL (Windows) haben. Dazu möchte ich benutzerdefinierte Datentypen definieren und nur OpenGL ES-Funktionen verwenden.OpenGL ES und OpenGL kompatible Shader

Ein Ansatz ist, zu definieren:

#define highp 
#define mediump 
#define lowp 

für Windows-Shader und den Shader zu schreiben, wie es für OpenGL ES ist.

Andere Ansatz ist, um benutzerdefinierte Datentypen, wie dies für OpenGL ES zu definieren:

#define hvec2 highp vec2 

und wie diese für Windows

#define hvec2 vec2 

Was denken Sie, ist besser? Haben Sie andere Lösungen für dieses Problem?

Antwort

4

Meine Lösung wurde Shader-Code zu schreiben, die mit beiden APIs kompatibel ist, und dann, wenn die Fragment-Shader-Quellcode zu OpenGL ES Hochladen prepend nur die folgenden Zeile:

precision mediump float; 

, die legt den Standard Fließkomma-Genauigkeit bis Medium. In OpenGL-ES-Fragment-Shadern gibt es keine Standardpräzisionsebene für Gleitkommawerte, was bedeutet, dass Sie entweder eine Genauigkeit für jede Gleitkommadeklaration angeben müssen oder explizit eine Standardgenauigkeit festlegen müssen. Sie könnten stattdessen lowp oder highp verwenden, wenn dies für Ihre Anwendung sinnvoller ist.

Für weitere Informationen siehe Abschnitt 4.5.3 der OpenGL ES Shading Language-Spezifikation: http://www.khronos.org/files/opengles_shading_language.pdf

Sie können auch mit Ihrem #define Ansatz, diesen Ansatz mischen, wenn Sie eine feinere Kontrolle über Präzision in Ihren Shadern benötigen.

4

könnten Sie verwenden http://www.opengl.org/registry/specs/ARB/ES2_compatibility.txt

Diese Erweiterung Unterstützung für Funktionen von OpenGL ES 2.0 fügt hinzu, die von OpenGL 3.x fehlen Durch die Aktivierung dieser Funktionen wird die Portierung von Anwendungen von OpenGL ES 2.0 auf OpenGL vereinfacht.

+0

Weiß jemand, wie das funktioniert? Ich habe die Spezifikation überflogen, konnte aber nichts darüber finden, wie eine GLSL ES (Version 100) und GLSL (Version 150) überhaupt kompatibel wären. –

+0

Für zukünftige Referenz entdeckte ich, dass unter OpenScape ES2_compatibility ein OpenGL 3.2> Kontext ES 2.0 Shader mit #version 100 an der Spitze laden kann. –

1

ich es geschafft, nur um die Definition der folgenden Beginn eines jeden Shader, wenn der Shader auf Windows läuft:

#define lowp 
#define mediump 
#define highp 

Zusätzliche i geben dem Shader die Informationen, die Plattform verwendet wird (WINDOWS MOBILE, IOS) was kann auf diese Weise verwendet werden:

#ifdef WINDOWS 
precision mediump float; 
#endif 
+0

Temperierte Upvote für den oberen Teil des Kommentars - Ich denke, es ist viel wertvoller, die Präzisionsmodifikatoren zu haben und auf irrelevanten Plattformen zu verwerfen, als sie nicht einzubeziehen, und woanders zu Leistungseinbußen zu kommen. Aber '#ifdef GL_ES' (und' # ifndef') ist der einfachste Weg, um bedingt zu kompilieren und eingebaut zu werden. – Tommy