在安卓上如何在着色器中声明OpenGL版本?

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";

我还在顶点着色器和片元着色器中添加了版本声明,但仍然收到相同的错误。我在GLSurfaceView中调用了setEGLContextClientVersion(3),并在清单中添加了,以指示应用程序需要OpenGL ES 3.0。我是否错误地阅读了OpenGL ES文档,不需要添加此版本声明?如果需要添加它,为什么总是导致错误?

1
有用的提示:使用glGetShaderInfoLog获取更详细的着色器编译错误信息。 - Arttu Peltonen
1个回答

10

阅读GLSL ES 3.0规范,它列出了“attribute”和“varying”作为保留关键字,使用会导致错误。

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

所以在顶点着色器中,

attribute -> in
varying   -> out

在片元着色器中

varying -> in

规范的第4.3节(存储限定符)包含了所有细节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接