Mad*_*ist 7 android opengl-es opengl-es-3.0
我正在试验OpenGL ES 3.0并在快速参考表中找到以下声明:
"#version 300 es"必须出现在用GLSL ES 3.00版编写的着色器程序的第一行.如果省略,着色器将被视为目标版本1.00.
所以我尝试在着色器的开头添加它,但这只会导致错误
由于顶点着色器无效,链接失败.
据报道.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";
Run Code Online (Sandbox Code Playgroud)
我还将version语句添加到顶点和片段着色器,仍然得到相同的错误.
我setEGLContextClientVersion(3)在我的GLSurfaceView中调用,并添加<uses-feature android:glEsVersion="0x00030000" android:required="true" />到我的清单中以表明该应用程序需要OpenGL ES 3.0.
我是否读错了OpenGL ES文档,我不需要添加此版本声明?如果我需要添加它,我做错了什么总是会导致错误?
阅读GLSL ES3.0规范,它将"属性"和"变化"列为保留关键字,这将导致错误.
在GLES3中,您必须使用"in"限定输入变量,并使用"out"输出变量.
所以在顶点着色器中,
attribute -> in
varying -> out
Run Code Online (Sandbox Code Playgroud)
并在片段着色器中
varying -> in
Run Code Online (Sandbox Code Playgroud)
规范(存储限定符)中的第4.3节具有所有细节.