我使用glGetActiveUniform从着色器中查询制服。但我也使用统一缓冲区(常规和std140)。查询它们会返回缓冲区中具有统一原型类型的数组。但我需要一种方法识别那些是统一的缓冲区而不是制服。 着色器中统一缓冲区的示例:
layout(std140, binding = LIGHTS_UBO_INDEX) uniform LightsBuffer {
LightInfo lights[MAX_LIGHTS];
};
是否可以仅查询GLSL着色器中的缓冲区?
答案 0 :(得分:0)
从技术上讲,你实际拥有的是一个统一的块。它有一个名字,但没有类型;它的成员(制服)有类型,我认为这就是你实际描述的内容。
由于程序内省的工作方式,这是一个非常重要的区别。使用OpenGL 4.3+(或GL_ARB_program_interface_query
),您会发现无法查询GL_UNIFORM_BLOCK
接口的类型。
glGetActiveUniformBlockiv (...)
可用于查询有关统一块的信息,但“LightsBuffer
”仍然是块而不是缓冲区。我的意思是,即使它有一个名为GL_BUFFER_BINDING
的属性,它实际上是统一块的绑定位置,而不是当前绑定到该位置的缓冲区。同样,GL_BUFFER_DATA_SIZE
是统一块所需数据的大小,而不是当前绑定的缓冲区的大小。