【问题标题】:How to write const array in GLSL ES如何在 GLSL ES 中编写 const 数组
【发布时间】:2015-02-11 14:00:53
【问题描述】:

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

【问题讨论】:

    标签: ios opengl-es glsl glsles


    【解决方案1】:

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

    或者你可以使用一系列if-statements。

    【讨论】:

    • 那我该怎么做呢?
    • 我添加了另一种答案。
    • Reto,如果它在函数体之外声明,您的替代方案将不起作用。最好的替代方法是将其声明为 uniform vec4 vertices[3] 并从您的 C 代码中指定值。
    【解决方案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)};
    

    【讨论】:

    • 根据 glsles 文档,glsles 只支持数组构造,不支持初始化。所以不,不幸的是,这不起作用!
    • 哦。这是令人惊讶和烦人的。 :( 如果你只是将3 添加到你的构造函数中呢?... vertices[3] = vec4[3](...)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多