如何在OpenGL中使用布局(打包)或布局(共享)时获得着色器存储块的可变偏移?

fdx2calv  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(123)

如果我在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,我知道这种方法。我想写程序不依赖于特定的内存布局。只需通过编程获得偏移量。)
我试着找到像glGetUniformIndicesglGetActiveUniformsiv这样适合着色器存储块的函数,但是没有这样的函数。
我希望有一种方法可以通过编程方式获得着色器存储块变量的偏移量,就像获得统一块变量的偏移量一样。

ryevplcw

ryevplcw1#

程序接口查询API是一个通用的工具,用于查询程序的任何外部接口组件。输入、输出、统一,还有存储缓冲区。许多这些接口(如glGetUniformIndices)都有单独的API,但创建了一个通用的API,用于所有现有的接口。
以及SSBO。
不同的可查询属性称为“接口”,统一块的属性通过GL_UNIFORM_BLOCK接口查询,统一块的 * 成员 * 通过GL_UNIFORM接口查询,同样的,GL_SHADER_STORAGE_BLOCK是查询存储块的属性,但是块的实际成员的属性通过GL_BUFFER_VARIABLE接口查询。
因此,与统一查询代码等效的程序接口查询将是:

GLuint var2_index = glGetProgramResourceIndex(program_id, GL_UNIFORM, "var2");

GLenum props[] = {GL_OFFSET};
GLint var2_offset;

glGetProgramResourceiv(program_id, GL_UNIFORM, var2_index, 1, props, 1, nullptr, &var2_offset);

SSBO的等效值为:

GLuint var2_index = glGetProgramResourceIndex(program_id, GL_BUFFER_VARIABLE, "var2");

GLenum props[] = {GL_OFFSET};
GLint var2_offset;

glGetProgramResourceiv(program_id, GL_BUFFER_VARIABLE, var2_index, 1, props, 1, nullptr, &var2_offset);

相关问题