我正在试验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";
我还向顶点和片段着色器添加了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
并在片段着色器中
varying -> in
规范中的第4.3节(存储限定符)具有所有详细信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句