着色器存储块与统一块

use*_*754 4 c++ glsl

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

我不明白的是着色器存储块的原子操作属性,这什么时候可以变得方便?有真实的例子吗?

此外,什么时候我更喜欢一个?

小智 6

我认为你的问题是不恰当的。听起来您正试图找出统一缓冲区和着色器存储缓冲区之间的区别。块只是组织着色器输入和输出的一种方式。

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

问为什么写入 ssbo 很方便就像问为什么变量很方便一样。任何时候您想要在渲染过程之间累积结果或共享数据,您都可以使用 ssbo 作为“临时内存”。

在过去(我相信),如果您想共享数据,您将不得不对纹理进行渲染,而这将经历整个图形管道,并承担由此带来的所有成本。

更多关于统一缓冲区对象的信息:

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

要真正确保您了解差异,请查看按时间顺序为着色器提供数据的各种方法:

  • 纹理和帧缓冲对象
  • 制服
  • 统一缓冲对象
  • 纹理缓冲对象
  • 带有图像加载/存储的纹理
  • 着色器存储缓冲区对象

这个关于 SO 的答案对几乎所有这些都有一个很好的概述:

将值列表传递给片段着色器