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

问题描述 投票:0回答:1

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

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

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

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

我什至不知道如何检索数组的位置。

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

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

c++ arrays opengl glsl
1个回答
4
投票

正如

glGetUniformLocation
文档所说:

name 必须是活动的统一变量 程序中的名称 不是结构, 结构数组,或者向量或向量的子组件 矩阵。

...

统一变量是结构体或数组 可以通过调用来查询结构 glGetUniformLocation 对于每个字段内 结构。

所以,一次只能查询一个字段。 像这样:

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

希望有帮助。

###编辑:### 通过使用 Interface BlocksUniform Buffer Objects

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

© www.soinside.com 2019 - 2024. All rights reserved.