我的(片段)着色器有一个包含 12 个结构的统一数组:
struct LightSource
{
vec3 position;
vec4 color;
float dist;
};
uniform LightSource lightSources[12];
在我的程序中,我有 12 个缓冲区对象,每个对象都包含一个光源的数据。 (它们需要是单独的缓冲区。)
如何将这些缓冲区绑定到着色器内各自的位置?
我什至不知道如何检索数组的位置。
glGetUniformLocation(program,"lightSources");
glGetUniformLocation(program,"lightSources[0]");
这些运行时不会引发错误,但位置肯定是错误的(4294967295)。 (该数组正在着色器内部使用,所以我认为它没有被优化)
glGetUniformLocation
文档所说:
name 必须是活动的统一变量 程序中的名称 不是结构, 结构数组,或者向量或向量的子组件 矩阵。
...
统一变量是结构体或数组 可以通过调用来查询结构 glGetUniformLocation 对于每个字段内 结构。
所以,一次只能查询一个字段。 像这样:
glGetUniformLocation(program,"lightSources[0].position")
glGetUniformLocation(program,"lightSources[0].color")
glGetUniformLocation(program,"lightSources[0].dist")
希望有帮助。
###编辑:### 通过使用 Interface Blocks、Uniform Buffer Objects 和
glGetUniformBlockIndex
,您可以让您的生活更轻松(以旧硬件/驱动程序兼容性为代价)。这将更像 DirectX 常量缓冲区。所需的硬件/驱动程序支持:OpenglGL 3.1 核心或 ARB_uniform_buffer_object
扩展。