gpt4 book ai didi

c++ - OpenGL/GLSL - 将缓冲区对象用于统一数组值

转载 作者:行者123 更新时间:2023-12-01 14:41:45 24 4
gpt4 key购买 nike

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

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

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

如何将这些缓冲区绑定(bind)到它们在着色器中的相应位置?

我什至不确定如何检索数组的位置。
glGetUniformLocation(program,"lightSources");
glGetUniformLocation(program,"lightSources[0]");

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

最佳答案

glGetUniformLocation docs说:

name must be an active uniform variable name in program that is not a structure, an array of structures, or a subcomponent of a vector or a matrix.

...

Uniform variables that are structures or arrays of structures may be queried by calling glGetUniformLocation for each field within the structure.



因此,您一次只能查询一个字段。
像这样:
glGetUniformLocation(program,"lightSources[0].position")
glGetUniformLocation(program,"lightSources[0].color")
glGetUniformLocation(program,"lightSources[0].dist")

希望能帮助到你。

编辑:

您可以使用 Interface Blocks 让您的生活更轻松(以旧硬件/驱动程序兼容性为代价) , Uniform Buffer Objects glGetUniformBlockIndex .这将更像 DirectX 常量缓冲区。所需的硬件/驱动程序支持:OpenGL 3.1 核心或 ARB_uniform_buffer_object 延期。

关于c++ - OpenGL/GLSL - 将缓冲区对象用于统一数组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20803961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com