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

时间:2013-09-07 11:41:14

标签: 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";

我还将version语句添加到顶点和片段着色器,但仍然得到相同的错误。

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

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

1 个答案:

答案 0 :(得分:6)

阅读GLSL ES3.0 spec列出“属性”和“变化”作为保留关键字,这将导致错误。

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

所以在顶点着色器中,

attribute -> in
varying   -> out

在片段着色器中

varying -> in

规范(存储限定符)中的第4.3节具有所有细节。