我正试图在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:'(':语法错误:数组大小必须出现在变量名
之后
答案 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)};