gpt4 book ai didi

opengl - 如何查询 SSBO 结构的对齐/步幅?

转载 作者:行者123 更新时间:2023-12-02 09:35:03 27 4
gpt4 key购买 nike

我不确定哪种结构布局最适合我的应用程序:共享打包std140std430。我并不是要求对每个信息进行解释,这些信息很容易找到,只是很难弄清楚每个信息对供应商兼容性/性能的影响。如果 shared 是默认值,我怀疑这是一个很好的起点。

据我所知,在使用共享打包时,我必须查询对齐/偏移,因为它是特定于实现的。

查询它的API是什么?在绑定(bind)计算着色器时,我是否会传递给 glGetShaderiv 一些参数,让我找出对齐方式?

最佳答案

使用glGetProgramInterface使用参数GL_SHADER_STORAGE_BLOCK来获取 Shader Storage Buffer Objects以及最大名称长度。
缓冲区变量的最大名称长度可以从程序接口(interface)GL_BUFFER_VARIABLE获取:

GLuint prog_obj; // shader program object
GLint no_of, ssbo_max_len, var_max_len;
glGetProgramInterfaceiv(prog_obj, GL_SHADER_STORAGE_BLOCK, GL_ACTIVE_RESOURCES, &no_of);
glGetProgramInterfaceiv(prog_obj, GL_SHADER_STORAGE_BLOCK, GL_MAX_NAME_LENGTH, &ssbo_max_len);
glGetProgramInterfaceiv(prog_obj, GL_BUFFER_VARIABLE, GL_MAX_NAME_LENGTH, &var_max_len);

SSBO的名称可以通过glGetProgramResourceName获取以及资源索引 glGetProgramResourceIndex :

std::vector< GLchar >name( max_len );
for( int i_resource = 0; i_resource < no_of; i_resource++ ) {

// get name of the shader storage block
GLsizei strLength;
glGetProgramResourceName(
prog_obj, GL_SHADER_STORAGE_BLOCK, i_resource, ssbo_max_len, &strLength, name.data());

// get resource index of the shader storage block
GLint resInx = glGetProgramResourceIndex(prog_obj, GL_SHADER_STORAGE_BLOCK, name.data());

// [...]
}

着色器存储 block 的数据可以通过glGetProgramResource检索。另请参阅Program Introspection .

从程序接口(interface)和GL_SHADER_STORAGE_BLOCK以及着色器存储 block 资源resInx获取缓冲区变量的数量及其索引:

for( int i_resource = 0; i_resource < no_of; i_resource++ ) {

// [...]

GLint resInx = ...

// get number of the buffer variables in the shader storage block
GLenum prop = GL_NUM_ACTIVE_VARIABLES;
GLint num_var;
glGetProgramResourceiv(
prog_obj, GL_SHADER_STORAGE_BLOCK, resInx, 1, &prop,
1, nullptr, &num_var);

// get resource indices of the buffer variables
std::vector<GLint> vars(num_var);
prop = GL_ACTIVE_VARIABLES;
glGetProgramResourceiv(
prog_obj, GL_SHADER_STORAGE_BLOCK, resInx,
1, &prop, (GLsizei)vars.size(), nullptr, vars.data());

// [...]
}

从程序接口(interface)GL_BUFFER_VARIABLE和资源索引vars[]获取缓冲区变量相对于缓冲区基址的偏移量(以基 native 器单位表示)及其名称>:

for( int i_resource = 0; i_resource < no_of; i_resource++ ) {

// [...]

std::vector<GLint> offsets(num_var);
std::vector<std::string> var_names(num_var);
for (GLint i = 0; i < num_var; i++) {

// get offset of buffer variable relative to SSBO
GLenum prop = GL_OFFSET;
glGetProgramResourceiv(
prog_obj, GL_BUFFER_VARIABLE, vars[i],
1, &prop, (GLsizei)offsets.size(), nullptr, &offsets[i]);

// get name of buffer variable
std::vector<GLchar>var_name(var_max_len);
GLsizei strLength;
glGetProgramResourceName(
prog_obj, GL_BUFFER_VARIABLE, vars[i],
var_max_len, &strLength, var_name.data());
var_names[i] = var_name.data();
}

// [...]
}

另请参阅ARB_shader_storage_buffer_object

关于opengl - 如何查询 SSBO 结构的对齐/步幅?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56512216/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com