问题描述
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
可以。
通常,您应该使用适合您的使用情况的最小内存占用的纹理格式。