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块操作 | 着色器存储块对应操作 |
|---|---|
glGetUniformIndices | glGetProgramResourceIndex(类型为GL_BUFFER_VARIABLE) |
glGetActiveUniformsiv + GL_UNIFORM_OFFSET | glGetProgramResourceiv + GL_OFFSET |
注意事项
- 如果程序中不存在同名变量,直接使用变量名(如"var2")也可正常获取索引,但推荐始终使用
块名.变量名的形式保证鲁棒性。 - 对于数组、结构体等复杂类型的变量,还可通过查询
GL_ARRAY_STRIDE、GL_MATRIX_STRIDE等属性获取额外内存布局信息,用法与GL_OFFSET一致。
内容的提问来源于stack exchange,提问作者Time-Coder
相关产品推荐
相关产品推荐

