2013-09-07 8 views
6

Ich experimentiere mit OpenGL ES 3.0 und die folgenden Anweisung in dem Schnellreferenzblatt gefunden:Wie deklariere ich die OpenGL-Version in Shadern auf Android?

„#version 300 es“ in der ersten Zeile eines Shader-Programms geschrieben in GLSL ES Version erscheinen 3.00 . Wenn dieser Parameter weggelassen wird, wird der Shader als Targeting-Version 1.00 behandelt.

So habe ich versucht, dies zu Beginn meiner Shadern hinzufügen, aber das führte nur in dem Fehler

Verbindung aufgrund ungültigen Vertex-Shader fehlgeschlagen.

wie von .glGetProgramInfoLog gemeldet. Wenn ich die erste Zeile mit der Anweisung "#version 300 gl" entferne, kompiliert der Shader und funktioniert.

Dies ist der Code meines Vertex-Shader

private final String vertexShaderCode = 
     "#version 300 es \n" + 
     "uniform mat4 uMVPMatrix; \n" + 
     "attribute vec2 a_TexCoordinate; \n" + 
     "attribute vec4 vPosition; \n" + 
     "varying vec2 v_TexCoordinate; \n" + 
     "void main() { \n" + 
     " v_TexCoordinate = a_TexCoordinate; \n" + 
     " gl_Position = uMVPMatrix * vPosition; \n" + 
     "} \n"; 

ich die Version Anweisung zum Scheitel und die Fragment-Shader, auch hinzugefügt und immer noch die gleichen Fehler.

Ich rufe setEGLContextClientVersion(3) in meinem GLSurfaceView, und ich fügte <uses-feature android:glEsVersion="0x00030000" android:required="true" /> meinem Manifest hinzu, um anzuzeigen, dass die App OpenGL ES 3.0 erfordert.

Liest ich die OpenGL ES-Dokumentation falsch und muss diese Version nicht hinzufügen? Wenn ich es hinzufügen muss, was mache ich falsch, dass es immer zu einem Fehler führt?

+1

Hilfreicher Tipp: Verwenden Sie glGetShaderInfoLog, um detailliertere Shader-Kompilierungsfehler zu erhalten. –

Antwort

6

Lesen der GLSL ES3.0 spec listet "Attribut" und "variieren" als reservierte Schlüsselwörter, die zu einem Fehler führen wird.

In GLES3 müssen Eingangsvariablen mit "in" und Ausgangsvariablen mit "out" qualifiziert werden.

So in der Vertex-Shader,

attribute -> in 
varying -> out 

Und im Fragment-Shader

varying -> in 

Abschnitt 4.3 in den spec (Speicher Qualifier) ​​hat alle Details.