如何在GLSL ES中编写const数组

时间:2015-02-10 15:27:59

标签: ios opengl-es glsl glsles

我正试图在iPhone上为OpenGL ES应用程序编写一个简单的顶点着色器,但是我的数组构造函数给我带来了麻烦。

attribute vec4 normal;
attribute vec4 position;

void main(void){

    const vec4 vertices[3] = vec4[](vec4(0.25, -0.25, 0.5, 1.0), 
                             vec4(-0.25, -0.25, 0.5, 1.0),
                             vec4(0.25, 0.25, 0.5, 1.0));
    gl_Position = vertices[gl_VertexID];

}

使用此代码时,着色器无法编译,并向我提供了错误消息:

  

错误:0:13:'(':语法错误:数组大小必须出现在变量名

之后

2 个答案:

答案 0 :(得分:8)

与ES 2.0一起使用的GLSL版本不支持常量数组。来自" 4.3.2恒定限定符"在规范的第30页:

  

包含数组的数组和结构可能不会被声明为常量,因为它们无法初始化。

此限制在ES 3.0中解除,在相应部分中说明了

  

const限定符可以与任何非void透明基本数据类型以及它们的结构和数组一起使用。

作为替代方案,您应该能够使用非常量数组,您可以逐个分配值(未经测试):

vec4 vertices[3];
vertices[0] = vec4(0.25, -0.25, 0.5, 1.0);
vertices[1] = vec4(-0.25, -0.25, 0.5, 1.0);
vertices[2] = vec4(0.25, 0.25, 0.5, 1.0);

或者您可以使用一系列if语句。

答案 1 :(得分:-2)

你试过大括号吗?

const vec4 vertices[3] = {vec4(0.25, -0.25, 0.5, 1.0),
                          vec4(-0.25, -0.25, 0.5, 1.0),
                          vec4(0.25, 0.25, 0.5, 1.0)};