了解GL_SHADER_STORAGE_BLOCK绑定
Understanding GL_SHADER_STORAGE_BLOCK binding
在使用计算着色器时,我看到大多数示例只是创建了GL_SHADER_STORAGE_BUFFERS,就像普通缓冲区一样:
glGenBuffers, glBindBuffer, glBufferData
然后它们是这样使用的:
glUseProgram(computeShader);
glBindBufferRange(GL_SHADER_STORAGE_BUFFER, **3**, bufferA, 0, bufferSize);
glBindBufferRange(GL_SHADER_STORAGE_BUFFER, **4**, bufferB, 0, bufferSize);
glDispatchCompute(computeShader);
在计算着色器中,缓冲区声明如下:
layout ( **binding = 3** ) buffer
buffer1
{
vec4 data1[];
};
layout ( **binding = 4** ) buffer
buffer2
{
vec4 data2[];
};
然后我得到了一些建议,在初始化后我应该做这样的事情:
GLuint index = glGetProgramResourceIndex(computeShader, GL_SHADER_STORAGE_BLOCK, "buffer1");
glShaderStorageBlockBinding(shader, index, index);
为什么这是必要的?
它有什么用途,因为 glBindBufferRange 需要 layout(binding = x) 指定的索引?
在这种情况下,它没有任何目的。您已经在着色器中显式设置了绑定 - 但如果查询着色器存储块的索引,也可以手动设置绑定。您可能希望在加载时更改它,而不是将其硬编码到着色器中,因为着色器存储缓冲区对象可以使用全局绑定点共享,与统一缓冲区对象非常相似。
事实上,它们与UBO非常相似,甚至几乎相同的API。真正的区别在于您可以:
- 在着色器中写入它们(如果这样做,最好使用内存屏障)
- 使用更大的存储(最低 16 MiB)
- 具有可变长度。
当引入 UBO 时,ARB_shading_language_420pack
(给出 layout (binding = ...)
) 尚未创建;这可能就是为什么您看到明确绑定 SSB 索引的建议的原因。
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 在基于范围的for循环中使用结构化绑定声明
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 视觉studo 2019中的漫画和静态/动态绑定
- 将自由函数绑定为类成员函数
- 将常量指针引用绑定到非常量指针
- 在派生类中绑定非静态模板化成员函数
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 在 openGL 中多次绑定缓冲区
- 定义有趣的宏和正则表达式在Z3 C++绑定
- 使用结构化绑定'Reflection'
- 为什么 std::绑定错误参数可以成功?
- 如何绑定 C++ gRPC 客户端的网络接口
- 在 openmp 中,omp_get_thread_num是否绑定到物理线程?
- C++绑定(已弃用)
- 运行时错误:引用绑定到类型为"int"的空指针
- 有没有办法将重载的类函数绑定到函数对象?
- 替换 C++17 中移除的绑定 1st