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

时间:2015-02-09 10:13:18

标签: opengl glsl

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

layout(std140, binding = LIGHTS_UBO_INDEX) uniform LightsBuffer {

   LightInfo  lights[MAX_LIGHTS];

};

是否可以仅查询GLSL着色器中的缓冲区?

1 个答案:

答案 0 :(得分:0)

从技术上讲,你实际拥有的是一个统一的块。它有一个名字,但没有类型;它的成员(制服)有类型,我认为这就是你实际描述的内容。

由于程序内省的工作方式,这是一个非常重要的区别。使用OpenGL 4.3+(或GL_ARB_program_interface_query),您会发现无法查询GL_UNIFORM_BLOCK接口的类型。

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