You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenGL中获取layout(packed/shared)着色器存储块变量偏移的方法

获取GLSL着色器存储块变量的偏移量

针对你定义的着色器存储块:

buffer test_block
{
    type1 var1;
    type2 var2;
    type3 var3;
};

可以通过OpenGL的程序资源查询函数实现类似uniform块的偏移量获取逻辑,步骤如下:

1. 获取目标变量的资源索引

使用glGetProgramResourceIndex函数,指定资源类型为GL_BUFFER_VARIABLE,变量名建议用块名.变量名的形式(避免多个块存在同名变量时的歧义):

const char* target_var_name = "test_block.var2";
GLuint var_index = glGetProgramResourceIndex(program_id, GL_BUFFER_VARIABLE, target_var_name);

2. 查询变量的偏移量

通过glGetProgramResourceiv函数,查询该变量的GL_OFFSET属性,即可得到偏移量:

GLint var_offset;
// 参数说明:程序ID、资源类型、变量索引、查询属性数量、属性列表、返回值数量、实际返回数量(可传nullptr)、结果存储地址
glGetProgramResourceiv(program_id, GL_BUFFER_VARIABLE, var_index, 
                       1, &GL_OFFSET, 1, nullptr, &var_offset);

与uniform块方法的对应关系

uniform块操作着色器存储块对应操作
glGetUniformIndicesglGetProgramResourceIndex(类型为GL_BUFFER_VARIABLE)
glGetActiveUniformsiv + GL_UNIFORM_OFFSETglGetProgramResourceiv + GL_OFFSET

注意事项

  • 如果程序中不存在同名变量,直接使用变量名(如"var2")也可正常获取索引,但推荐始终使用块名.变量名的形式保证鲁棒性。
  • 对于数组、结构体等复杂类型的变量,还可通过查询GL_ARRAY_STRIDE、GL_MATRIX_STRIDE等属性获取额外内存布局信息,用法与GL_OFFSET一致。

内容的提问来源于stack exchange,提问作者Time-Coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 21:01:09