Shader Storage Buffer Object
也是一种缓冲区对象,用于存储与检索着色器语言的数据,简称SSBO,类似于UBO。存储SSBO的缓冲区对象绑定到SSBO binding point。
SSBO与UBO的区别:
1.SSBO的容量大的多,opengl的规范保证UBOS的大小可达到16KB(实现时可允许更大),SSBO的大小可达到128MB(大多数实现可允许分配大小达到GPU的内存极限)。
2.SSBOS可写,atomically(甚至块成员可执行原子操作) ,其读写使用非连贯内存访问。
3.SSBOS可变存储,而UBOS必须有具体的、固定的存储尺寸。因此SSBOS内可有任意长度的数组,数组的实际大小基于缓存区的范围。
关键字:buffer,指定的memory layout 是: std430。
std140与std430 packing layout 据着色器语言的版本命名的。 std430相对于std130而言,有更好的内存效率以及与如C++语言等的编译器生成的结构布局能更好的衔接。
atomic operation 有Add、And、Or、Xor、Min、Max、Exchange、CompSwap。 这些函数只有 int/uint 类型。
同步访问内存存在一些可能的危害:
(1)read-after-write(RAW)
(2)write-after-write(WAW)
(3)write-after-read(WAR)
所以有了 memory barrier。glMemoryBarrier(GLbitfield barriers): 参数有如GL_SHADER_STOGAR