如何在GLSL ES中编写const数组

Oli*_*ver 3 opengl-es glsl ios 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];

}
Run Code Online (Sandbox Code Playgroud)

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

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

Ret*_*adi 8

与ES 2.0一起使用的GLSL版本不支持常量数组.从规范第30页的"4.3.2恒定限定符"部分:

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

此限制在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);
Run Code Online (Sandbox Code Playgroud)

或者你可以使用一系列的if陈述.


Ian*_*ald -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)};
Run Code Online (Sandbox Code Playgroud)

  • 根据 glsles 文档,glsles 仅支持数组构造,而不支持初始化。所以不幸的是,这不起作用! (2认同)