【发布时间】:2017-06-16 12:33:16
【问题描述】:
我正在尝试实现统一块。
这是块在我的片段着色器中的样子:
struct Light {
uint LightType;
vec3 Direction;
float SpotBlur;
vec3 AmbientColor;
float LinearAttenuation;
vec3 DiffuseColor;
float QuadraticAttenuation;
vec3 SpecularColor;
float CubicAttenuation;
vec3 Position;
float SpotCutoff;
};
layout(std140) uniform LightBlock
{
Light values;
} lights[32];
如您所见,我定义了一个固定大小为 32 的 Light 结构数组。我可以毫无问题地上传数据,但现在出现了我不明白的问题。 如果“灯光”数组的尺寸相对较小(大约 6 个),我的所有着色器制服都会找到。但是当增加“灯”的大小时,它开始有点覆盖我的制服。例如,它再也无法从顶点着色器中找到我的“modelViewProjection”矩阵(返回 -1 作为统一位置)。
【问题讨论】:
-
我不确定你想要实现什么,但如果你想用统一的缓冲区支持 LightBlock,
[32]不应该属于values而不是lights?目前您定义了 32 个块,而不是具有 32 个条目的块。 -
@bitQuake: 请stop using
vec3in interface blocks. 尤其是您的布局真的 很糟糕,因为在每个float/int之后,有12 个字节的填充(@987654329 @ 对齐到 16 个字节)。
标签: opengl glsl buffer shader uniform