Apple的Metal示例在使用texture2D<float>
和texture2D<half>
之间交替使用,我认为MTKView
的默认像素格式是bgra8unorm
。是什么决定了我应该使用float
还是half
?我需要在CPU上指定一些东西吗?还是所有float4s
中使用128位的纹理会自动转换为halfs
?如果我传入一个bgra8格式的纹理,换一种方式怎么样?我之所以这么问,是因为我试图使用MTKTextureLoader和纯字节数据加载纹理,而且我不确定纯字节数据使用什么格式,所以事情是一致的。我可以澄清一下吗?
这实际上取决于您的用例。
加载:您可能可以安全地将数据加载到与该数据格式相同的纹理中。当渲染目标具有不同的格式时,Metal将为您执行转换。
中间体:中间体纹理的格式应该真正取决于";分辨率";(如"位数"(,这取决于输入数据和颜色空间。如果你只处理sRGB数据,8位纹理可能就足够了(除非你做一些需要更高精度的复杂处理(。如果您希望支持宽色域(例如,在Display P3颜色空间中(,则需要更高的精度(half
应该很好(,并且还希望能够存储[0…255]范围之外的值。在iOS上,我建议使用half
来提高内存效率(由于大多数设备都不支持完全浮动(,我认为在macOS上float
是默认的。
视图:视图的像素格式实际上应该取决于显示。现在大多数屏幕都支持Display P3颜色空间。为此,您应该使用bgra10_xr
格式,因为它已针对这种情况进行了优化。否则bgra8unorm
是好的。
通常,您应该使用适合您的用例的内存占用最小的纹理格式。