我正在试验OpenGL ES 3.0并在快速参考表中找到以下声明:
“#version 300 es” must appear in the first line of a shader program
written in GLSL ES version 3.00. If omitted,the shader will be
treated as targeting version 1.00.
Link Failed because of invalid vertex shader.
由.glGetProgramInfoLog报告.如果我使用“#version 300 gl”语句删除第一行,则着色器将编译并运行.
这是我的顶点着色器的代码
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";
我还将version语句添加到顶点和片段着色器,仍然得到相同的错误.
我在我的GLSurfaceView中调用了setEGLContextClientVersion(3),并添加了< uses-feature android:glEsVersion =“0x00030000”android:required =“true”/>到我的清单,表明该应用程序需要OpenGL ES 3.0.
解决方法
阅读
GLSL ES3.0 spec,它将“属性”和“变化”列为将导致错误的保留关键字.
在GLES3中,您必须使用“in”限定输入变量,并使用“out”输出变量.
所以在顶点着色器中,
attribute -> in varying -> out
并在片段着色器中
varying -> in
规范(存储限定符)中的第4.3节具有所有细节.