如何知道使用哪种金属纹理格式?短还是一半?

问题描述

Apple的Metal示例在使用texture2D<float>texture2D<half>之间交替出现,我相信MTKView认像素格式为bgra8unorm。是什么决定我应该使用float还是half?我是否需要在cpu指定内容,还是将使用全部128位float4s的纹理自动转换为halfs?如果我使用bgra8format传递纹理,反过来又怎么样?我问是因为我试图使用MTKTextureLoader以及从纯字节数据加载纹理,并且我不确定用于纯字节数据的格式,因此情况是一致的。我可以澄清一下吗?

解决方法

这实际上取决于您的用例。

加载:您可以安全地将数据加载到与该数据相同格式的纹理中。当您的渲染目标格式不同时,Metal将为您执行转换。

中间体:中间纹理的格式实际上应取决于所需的“分辨率”(如“位数”),具体取决于输入数据和色彩空间。如果仅处理sRGB数据,则8位纹理可能就足够了(除非您进行一些需要更高精度的复杂处理)。如果要支持广泛的色域(例如在Display P3色彩空间中),则需要更高的精度({half应该很好),并且还希望能够存储[0 ... 255]之外的值范围。我认为,在iOS上,我建议使用half来提高内存效率(并且由于大多数设备仍然不支持完全浮动),我认为在macOS上,float是默认设置。

视图:视图的像素格式应确实取决于显示。现在,大多数屏幕都支持Display P3色彩空间。为此,您应该使用bgra10_xr格式,因为它已针对这种情况进行了优化。否则,bgra8unorm可以。

通常,您应该使用适合您的使用情况的最小内存占用的纹理格式。