跳转至

buffer块

GLSL中的buffer块,或者对于应用程序而言,就是 着色器的存储缓存对象(shader storage buffer object,SSBO)

buffer BufferObject{ //创建一个可读写的buffer块
    int mode;        //序言(preamble)成员
    vec4 points[];   //最后一个成员可以是未定义大小的数组
};

特点

它的行为类似uniform块。不过两者之间有两个决定性的差别,使得buffer块的功能更为强大。

支持变长数组

std::vector类型相似,支持不定长数组。并且可以在应用程序中编译和链接之后,渲染之前设置它的大小

  • 在着色器中,可以使用数组的成员函数length()获取渲染时的数组大小。如points.length()

支持写操作

着色器可以对buffer块中的成员执行读或写操作。写入操作对着色器存储缓存对象的修改对于其他着色器调用都是可见的。

这种特性对于计算着色器非常有意义,尤其是对非图像的内存区域进行处理的时候。

如何选择

  1. 如果你不需要写入缓存中,那么可以直接使用uniform块,并且硬件设备本身可能也没有足够的资源空间来支持buffer块,但是uniform块通常是足够的
  2. buffer块只可以使用std430布局,而uniform块可以选择std140或者std430布局
  3. uniform不能变长;而buffer支持变长

参考链接

  1. 《OpenGL编程指南(原书第9版)》——2.4 数据块接口
  2. Shader Storage Buffer Object - OpenGL Wiki (khronos.org)