如果我在GLSL中定义了一个着色器存储块,如下所示:
buffer test_block
{
type1 var1;
type2 var2;
type3 var3;
};
如何获取此块中某个变量的偏移量?
我们知道,如果它是一个均匀的块就像这样:
uniform test_block
{
type1 var1;
type2 var2;
type3 var3;
};
我们可以这样得到偏移量,例如得到var2
的偏移量:
char[] var2_name = "var2";
int var2_index;
glGetUniformIndices(program_id, 1, &var2_name, &var2_index);
int var2_offset;
glGetActiveUniformsiv(program_id, 1, &var2_index, GL_UNIFORM_OFFSET, &var2_offset);
// then var2_offset is what you want
这是用于统一块。但我找不到任何教程获得偏移的着色器存储块变量的偏移。
(Don不要告诉我使用std140或std430,我知道这种方法。我想写程序不依赖于特定的内存布局。只需通过编程获得偏移量。)
我试着找到像glGetUniformIndices
和glGetActiveUniformsiv
这样适合着色器存储块的函数,但是没有这样的函数。
我希望有一种方法可以通过编程方式获得着色器存储块变量的偏移量,就像获得统一块变量的偏移量一样。
1条答案
按热度按时间ryevplcw1#
程序接口查询API是一个通用的工具,用于查询程序的任何外部接口组件。输入、输出、统一,还有存储缓冲区。许多这些接口(如
glGetUniformIndices
)都有单独的API,但创建了一个通用的API,用于所有现有的接口。以及SSBO。
不同的可查询属性称为“接口”,统一块的属性通过
GL_UNIFORM_BLOCK
接口查询,统一块的 * 成员 * 通过GL_UNIFORM
接口查询,同样的,GL_SHADER_STORAGE_BLOCK
是查询存储块的属性,但是块的实际成员的属性通过GL_BUFFER_VARIABLE
接口查询。因此,与统一查询代码等效的程序接口查询将是:
SSBO的等效值为: