8

我正在试验 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";

我还在顶点和片段着色器中添加了版本语句,但仍然得到相同的错误。

我调用setEGLContextClientVersion(3)了我的 GLSurfaceView,并添加<uses-feature android:glEsVersion="0x00030000" android:required="true" />到我的清单中以指示该应用程序需要 OpenGL ES 3.0。

我是否错误地阅读了 OpenGL ES 文档并且不需要添加此版本声明?如果我需要添加它,我做错了什么总是导致错误?

4

1 回答 1

9

阅读GLSL ES3.0 规范,它将“属性”和“变化”列为将导致错误的保留关键字。

在 GLES3 中,您必须使用“in”限定输入变量,使用“out”限定输出变量。

所以在顶点着色器中,

attribute -> in
varying   -> out

在片段着色器中

varying -> in

规范中的第 4.3 节(存储限定符)包含所有详细信息。

于 2013-09-07T15:01:18.477 回答