如何在GLSL ES中编写const数组

5

我正在尝试为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];

}

使用此代码时,着色器无法编译,并显示以下错误消息:
ERROR: 0:13: '(' : 语法错误:数组大小必须出现在变量名之后
2个回答

9
使用ES 2.0的GLSL版本不支持常量数组。从规范第30页的“4.3.2常量限定符”一节中可以看出:

由于无法初始化,因此不能声明包含数组的数组和结构为常量。

在对应的章节中,ES 3.0解除了这个限制,并表示:

非void透明基本数据类型以及这些类型的结构和数组都可以使用const限定符。

作为替代方案,您可以使用非常量数组,一个一个地赋值(未经测试):
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语句。

那么我应该做什么? - Oliver
我在答案中添加了一种替代方案。 - Reto Koradi
Reto,你的替代方案如果在函数体外声明将不起作用。最好的替代方案是将其声明为uniform vec4 vertices[3]并从你的C代码中指定值。 - prideout
可以确认备选方案不起作用。 - Saeed Masoomi

-1

你试过花括号吗?

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

2
根据glsles文档,glsles仅支持数组构造,而不支持初始化。所以很遗憾,这样是行不通的! - Oliver
哦,这令人惊讶又烦人。:( 如果您只是在构造函数中添加 3,会怎么样呢?... vertices[3] = vec4[3](...) - Ian MacDonald

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