着色器存储块vs统一块

Shader Storage Block vs Uniform Blocks

本文关键字:一块 vs 存储      更新时间:2023-10-16

我现在读到,你不能写统一块,所以着色器存储块比统一块有优势。此外,着色器存储块的大小(上限)要高得多。

我没有得到的是一个着色器存储块的原子操作属性,什么时候可以变得方便?有现实生活中的例子吗?

此外,当我更喜欢一个比另一个?

我认为你的问题提得不对。这听起来像你试图找出统一缓冲区和着色器存储缓冲区之间的差异。块只是组织着色器输入和输出的一种方式。

正如你所指出的,统一缓冲区和着色器存储缓冲区之间最大的区别是你可以从着色器程序中写入着色器存储缓冲区。

问为什么写ssbo很方便,就像问为什么变量很方便。任何时候你想积累结果或在渲染通道之间共享数据,你都可以使用ssbo作为"临时内存"。

在过去(我相信),如果你想要共享数据,你必须对纹理进行渲染,这将需要通过整个图形管道,并承担所有的成本。

关于着色器存储缓冲对象的更多信息:

https://www.opengl.org/wiki/Shader_Storage_Buffer_Object

为了真正确保你理解其中的区别,请按时间顺序查找各种提供着色器数据的方法:

  • 纹理,帧缓冲对象
  • 制服
  • 统一缓冲对象
  • 纹理缓冲对象
  • 纹理与图像加载/存储
  • Shader Storage Buffer Objects

这个关于SO的答案很好地概述了几乎所有这些问题:

给fragment shader传递一个值列表