首页 > 解决方案 > GLSL 统一块中的静态数组

问题描述

我有一个带有这个统一块的 GLSL 计算着色器:

#define MAX_OCTAVE_COUNT 8

layout(std140) uniform Parameters {
    float time;
    int octaveCount, octaveSize, executionCount;
    float octaveWeight[MAX_OCTAVE_COUNT];
    int chunkSize;
} params;

我将这个结构(D语言)传递给它:

struct GenParams {
    GLfloat time;
    GLint octaveCount, octaveSize, executionCount;
    GLfloat[MAX_OCTAVE_COUNT] octaveWeight;
    GLint chunkSize;
}

但是,对于octaveWeight[x]where x > 0,数据没有被传递(x = 0是的)。当我将浮动的静态数组更改为两个vec4(仅在着色器端)时,它可以工作。

这里有什么问题?

标签: openglglsl

解决方案


请参阅:https ://computergraphics.stackexchange.com/questions/4454/opengl-es-3-uniform-b​​uffer-object-with-float-array

如果成员是标量或向量数组,则根据规则 (1)、(2) 和 (3) 设置基本对齐方式和数组跨度以匹配单个数组元素的基本对齐方式,并向上舍入为vec4 的基本对齐方式。数组末尾可能有填充;数组后面的成员的基本偏移量向上舍入到基本对齐的下一个倍数。

所以数组中的浮点数被四舍五入到 vec4 大小。


推荐阅读