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

时间:2015-07-12 18:40:45

标签: directx shader compute-shader

我尝试使用计算着色器实现fluid dynamics。在文章中,对纹理进行了一系列传递,因为这是在计算着色器之前编写的。

对纹理或缓冲区进行每次传递会更快吗?无论如何,最终的传递必须应用于纹理。

1 个答案:

答案 0 :(得分:3)

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

您使用双线性过滤链接的算法中似乎存在各个阶段。如果您限制自己使用缓冲区,则必须发出4或8个内存提取(取决于2D或3D),然后使用更多指令来计算加权平均值。充分利用硬件的能力为您做到这一点。

另一件需要注意的事情是,纹理中的数据并不像您预期​​的那样逐行(线性地)布局,而是以相邻纹素在内存中尽可能彼此接近的方式放置;这可以称为Tiling或Swizzling,具体取决于您阅读的文档。因此,除非您的模拟是一维的,否则从布局最接近模拟尺寸的资源读取/写入中可以获得更好的缓存一致性。