Opengl 识别GLSL着色器中的统一缓冲区

Opengl 识别GLSL着色器中的统一缓冲区,opengl,glsl,Opengl,Glsl,我使用从着色器查询统一。但我也使用统一缓冲区(常规和std140)。查询它们会返回一个带有缓冲区中统一基本类型的数组。但我需要一种方法来识别这些是统一缓冲区而不是统一。 着色器中的统一缓冲区示例: layout(std140, binding = LIGHTS_UBO_INDEX) uniform LightsBuffer { LightInfo lights[MAX_LIGHTS]; }; 是否可以仅从GLSL着色器查询缓冲区 从技术上讲,这里实际上是一个统一块。它有一个名称,但

我使用从着色器查询统一。但我也使用统一缓冲区(常规和std140)。查询它们会返回一个带有缓冲区中统一基本类型的数组。但我需要一种方法来识别这些是统一缓冲区而不是统一。 着色器中的统一缓冲区示例:

layout(std140, binding = LIGHTS_UBO_INDEX) uniform LightsBuffer {

   LightInfo  lights[MAX_LIGHTS];

};

是否可以仅从GLSL着色器查询缓冲区

从技术上讲,这里实际上是一个统一块。它有一个名称,但没有类型;它的成员(制服)有不同的类型,我想这就是你所描述的

这是一个相当重要的区别,因为程序内省的工作方式。使用OpenGL 4.3+(或),您将发现无法查询
GL\u UNIFORM\u BLOCK
接口的类型


glGetActiveUniformBlockiv(…)
可用于查询有关统一块的信息,但“
LightsBuffer
”仍然是块而不是缓冲区。我的意思是,即使它有一个名为
GL\u BUFFER\u BINDING
的属性,它实际上是统一块的绑定位置,而不是当前绑定到该位置的缓冲区。同样,
GL\u BUFFER\u DATA\u SIZE
是统一块所需的数据大小,而不是当前绑定的缓冲区大小。

我的黑客是搜索'块中包含的统一数组的['字符。但是,我真的希望能够将整个块作为统一缓冲区进行标识。@MichaelIV:统一块没有数组下标。您找到的是统一块中的统一数组。我想您的意思是
lights[…].
?是的。同样,我完全理解你的意思。但最好将统一块作为实体查询,以便自动解析所有统一及其类型,以便在客户端上构造适当的结构。例如,我查询所有(活动统一)从着色器在我的ShaderProgram对象中构造适当的统一结构。使用UBOs,这更为棘手,因为我无法从统一块推断内存中的大小以及缓冲区的类型等。@MichaelIV:如果你以GL 4.3为目标,这应该不会太难。我将看看今晚晚些时候是否可以编写一个示例程序。你可以枚举al在一个统一块中很容易找到一个活动的制服,我想这会满足你们的要求。我通常针对4.3,我认为如果我使用缓冲块,而不是统一块,我可以部分地做到这一点。但我目前不能进入缓冲块,因为我需要向后支持。