计算着色器、缓冲区或纹理

Compute Shader, Buffer or texture

我正在尝试使用计算着色器实现 fluid dynamics。文章中有一系列在纹理上完成的通道,因为这是在计算着色器之前编写的。

在纹理或缓冲区上进行每次传递会更快吗?最终通道无论如何都必须应用于纹理。

我建议使用适合模拟的资源维度。如果是 1D 模拟,则使用 RWBuffer,如果是 2D 模拟,则使用 RWTexture2D,如果是 3D 模拟,则使用 RWTexture3D。

您链接的算法中似乎有一些阶段使用了双线性过滤。如果您限制自己使用缓冲区,则必须执行 4 或 8 次内存提取(取决于 2D 或 3D),然后执行更多指令来计算加权平均值。尽可能利用硬件的能力为您执行此操作。

另一件需要注意的事情是,纹理中的数据并没有像您预期的那样逐行(线性)排列,而是以相邻纹素在内存中彼此接近的方式排列可能的;这可以称为 Tiling 或 Swizzling,具体取决于您阅读的文档。出于这个原因,除非您的模拟是一维的,否则您可能会从布局与模拟维度最匹配的资源中获得 reads/writes 上更好的缓存一致性。