如何在Android的着色器中声明OpenGL版本?

疯狂的科学家

我正在试验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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章