金属纹理的就地处理

in-place processing of a Metal texture

是否可以在没有 osx_ReadWriteTextureTier2 的情况下就地处理 MTLTexture

看来我可以将两个纹理参数设置为相同的纹理。这是受支持的行为吗?

具体来说,我不介意在写入后不更新纹理缓存。我只想就地(和稀疏地)修改 3d 纹理。拥有两个纹理是内存限制。而且复制整个纹理的计算成本很高,尤其是当我可能只更新其中的一小部分时。

根据文档,无论功能可用性如何,在函数签名中声明两个单独的纹理参数(一个读取,一个写入)然后为两者设置相同的纹理是无效的。

任何支持 osx_GPUFamily1_v2 的 Mac 都支持函数纹理读写(通过使用 access::read_write 声明纹理)。

"Tier 1"(没有明确的常量)和osx_ReadWriteTextureTier2的区别在于后者支持读写纹理的附加像素格式。

如果您确定您的目标 Macs 不支持您需要的那种纹理读写(因为您需要部署到 OS X 10.11 或者因为您正在使用一种与您要部署到的机器层不兼容的像素格式),您可以一次在纹理上操作一个平面,从 3D 纹理中读取,写入 2D 纹理,然后将结果 blitting 回相应的区域在你的 3D 纹理中。它的工作量更大,但它使用的内存将少于两倍。