如何知道使用哪种金属纹理格式?短还是半?
How to know which Metal texture format to use? short or half?
Apple 的 Metal 示例交替使用 texture2D<float>
和 texture2D<half>
,我相信 MTKView
的默认像素格式是 bgra8unorm
。是什么决定我应该使用 float
还是 half
?我是否需要在 CPU 上指定一些内容,或者使用全部 128 位 float4s
的纹理会自动转换为 halfs
?如果我传入具有 bgra8format 的纹理,反过来又如何?我问是因为我正在尝试使用 MTKTextureLoader 以及从普通字节数据加载纹理,而且我不确定普通字节数据使用什么格式,所以事情是一致的。我可以澄清一下吗?
这真的取决于您的用例。
加载:您可能可以安全地将数据加载到与该数据具有相同格式的纹理中。当您的渲染目的地具有不同的格式时,Metal 将为您执行转换。
Intermediates:中间纹理的格式实际上应该取决于您需要的“分辨率”(如“位数”),这取决于输入数据和颜色 space。如果你只处理 sRGB 数据,8 位纹理可能就足够了(除非你做一些需要更高精度的复杂处理)。如果你想支持宽色域(例如在 Display P3 color space 中),你需要更高的精度(half
应该没问题)并且还希望能够存储 [0. ..255]范围。在 iOS 上,我建议使用 half
来提高内存效率(并且因为大多数设备无论如何都不支持全浮点),我认为在 macOS 上 float
是默认值。
View: 视图的像素格式应该取决于显示器。大多数屏幕现在都支持 Display P3 颜色 space。为此,您应该使用 bgra10_xr
格式,因为它针对这种情况进行了优化。否则 bgra8unorm
没问题。
一般来说,您应该使用适合您的用例的最小内存占用的纹理格式。
Apple 的 Metal 示例交替使用 texture2D<float>
和 texture2D<half>
,我相信 MTKView
的默认像素格式是 bgra8unorm
。是什么决定我应该使用 float
还是 half
?我是否需要在 CPU 上指定一些内容,或者使用全部 128 位 float4s
的纹理会自动转换为 halfs
?如果我传入具有 bgra8format 的纹理,反过来又如何?我问是因为我正在尝试使用 MTKTextureLoader 以及从普通字节数据加载纹理,而且我不确定普通字节数据使用什么格式,所以事情是一致的。我可以澄清一下吗?
这真的取决于您的用例。
加载:您可能可以安全地将数据加载到与该数据具有相同格式的纹理中。当您的渲染目的地具有不同的格式时,Metal 将为您执行转换。
Intermediates:中间纹理的格式实际上应该取决于您需要的“分辨率”(如“位数”),这取决于输入数据和颜色 space。如果你只处理 sRGB 数据,8 位纹理可能就足够了(除非你做一些需要更高精度的复杂处理)。如果你想支持宽色域(例如在 Display P3 color space 中),你需要更高的精度(half
应该没问题)并且还希望能够存储 [0. ..255]范围。在 iOS 上,我建议使用 half
来提高内存效率(并且因为大多数设备无论如何都不支持全浮点),我认为在 macOS 上 float
是默认值。
View: 视图的像素格式应该取决于显示器。大多数屏幕现在都支持 Display P3 颜色 space。为此,您应该使用 bgra10_xr
格式,因为它针对这种情况进行了优化。否则 bgra8unorm
没问题。
一般来说,您应该使用适合您的用例的最小内存占用的纹理格式。