OpenGL / GLSL - 使用缓冲区对象获得统一的数组值

时间:2013-12-27 16:17:46

标签: c++ arrays opengl glsl

我的(片段)着色器有一个包含12个结构的统一数组:

struct LightSource
{
    vec3 position;
    vec4 color;
    float dist;
};
uniform LightSource lightSources[12];

在我的程序中,我有12个缓冲区对象,每个缓冲区对象包含一个光源的数据。 (它们需要是单独的缓冲区。)

如何将这些缓冲区绑定到着色器内各自的位置?

我甚至不确定如何检索数组的位置。

glGetUniformLocation(program,"lightSources");
glGetUniformLocation(program,"lightSources[0]");

这些运行时没有调用错误,但位置肯定是错误的(4294967295)。 (该数组正在着色器中使用,因此我认为它不会被优化)

1 个答案:

答案 0 :(得分:4)

正如glGetUniformLocation docs所说:

  

名称必须是有效的统一变量       程序中的名称不是结构,       结构数组,或向量或a的子组件       基质

     

...

     

作为结构或数组的统一变量       可以通过调用来查询结构       glGetUniformLocation 为每个字段       结构。

因此,您一次只能查询一个字段。 像这样:

glGetUniformLocation(program,"lightSources[0].position")
glGetUniformLocation(program,"lightSources[0].color")
glGetUniformLocation(program,"lightSources[0].dist")

希望它有所帮助。

编辑:

您可以使用Interface BlocksUniform Buffer ObjectsglGetUniformBlockIndex让您的生活更轻松(以旧硬件/驱动程序兼容性为代价)。这将更像DirectX常量缓冲区。所需的硬件/驱动程序支持:OpenglGL 3.1核心或ARB_uniform_buffer_object扩展名。