从计算着色器写入 1 MB 并在片段着色器中读取它的最有效方法是什么?

What's the most efficient way to write 1 MB from a compute shader and read it in a fragment shader?

在 OpenGL 中,有许多不同种类的存储选项:缓冲区、纹理、帧缓冲区等。在 OpenGL 中,似乎很难弄清楚何时使用。

我想编写一个计算缓冲区,在每个帧上将最多约 1 MB 写入某种类型的存储,然后由片段着色器读取(只读,随机访问)。从计算着色器写入数据以便在片段着色器中访问的最有效机制是什么?

数据由自定义数据结构组成:它不是特定渲染类型的数据,例如纹理。

通常,您可以通过多种方式处理跨管道的数据传输。

1. UBO

当你有足够大的固定数据量或者你可以将单个制服与 UBO 组合在一起时使用。它们比 SSBO 更快,但有大小限制并且不能有可变大小。 我看到一些供应商甚至支持 2GB 大小的 UBO。但我不确定这是否仍然具有旧 UBO 的性能优势。您可以查询UBO的大小限制并自行决定。

2。 SSBO

当您拥有非常大的数据时,通常更喜欢 SSBO。它们比 UBO 慢,但可以容纳更大的数据。在内部,它们是使用纹理缓冲内存实现的。

一般来说,我更喜欢 UBO 中 64 K 的数据限制以及任何大于 SSBO 中的数据。

另一种可能的交流方式是使用转换反馈。但我不确定这是否有效。但是考虑到计算着色器计算的数据将在将其发送到片段着色器之前由应用程序处理的情况。这种情况转换反馈可能是理想的。