存储在 MTLBuffer 中的效率

efficiency of storing in MTLBuffer

我想在我的着色器中将图像浮点数据存储在未格式化的内存位置,而 MTLBuffer 似乎是答案。首先,这可能吗?我在 MTLBuffer 的苹果文档中看到可以访问指向缓冲区的指针。是否可以在着色器中使用该指针来填充分配的内存?其次,我想知道这个操作的速度有多快;它会像使用纹理一样快速高效吗?

我问这个是因为如果确认 MTLBuffer 的访问速度与使用 MTLTexture 的操作相当,我需要重新设计我的很多代码。

首先,重要的是要了解几个 restrictions:

  • 片段着色器既不支持写入纹理也不支持写入缓冲区。您唯一的选择是渲染到纹理。
  • 顶点着色器支持写入缓冲区但不支持写入纹理。

因此,如果您正在使用这些着色器类型中的任何一种,则无论性能如何,您都无法在纹理写入和缓冲区写入之间做出选择。
如果您使用的是计算着色器并且您的写入模式相对简单(即 1 对 1 线程 ID 与像素对应),我希望缓冲区写入速度更快。也就是说,没有好的一般建议,所以最好的解决方案是同时尝试和配置文件。