我的(片段)着色器有一个包含12个结构的统一数组:
struct LightSource
{
vec3 position;
vec4 color;
float dist;
};
uniform LightSource lightSources[12];
在我的程序中,我有12个缓冲区对象,每个缓冲区对象包含一个光源的数据。 (它们需要是单独的缓冲区。)
如何将这些缓冲区绑定到着色器内各自的位置?
我甚至不确定如何检索数组的位置。
glGetUniformLocation(program,"lightSources");
glGetUniformLocation(program,"lightSources[0]");
这些运行时没有调用错误,但位置肯定是错误的(4294967295)。 (该数组正在着色器中使用,因此我认为它不会被优化)
答案 0 :(得分:4)
正如glGetUniformLocation
docs所说:
名称必须是有效的统一变量 程序中的名称不是结构, 结构数组,或向量或a的子组件 基质
...
作为结构或数组的统一变量 可以通过调用来查询结构 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
扩展名。