如何在GLSL ES中编写const数组

我想为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:'(':语法错误:数组大小必须出现在variables名称后面

与ES 2.0一起使用的GLSL版本不支持常量数组。 从规范第30页的“4.3.2常数限定符”

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

这个限制在ES 3.0中被解除了,它在相应的部分中说:

const限定符可以用于任何非空的透明基本数据types以及这些的结构和数组。

作为替代scheme,您应该可以使用非常量数组,您可以逐一分配值(未经testing):

 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 -statements。

你尝试过大括号吗?

 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)};