【问题标题】:How to know which Metal texture format to use? short or half?如何知道使用哪种金属纹理格式?短或一半?
【发布时间】:2021-02-06 01:40:02
【问题描述】:

Apple 的 Metal 示例交替使用 texture2D<float>texture2D<half>,我相信 MTKView 的默认像素格式是 bgra8unorm。是什么决定了我应该使用float 还是half?我是否需要在 CPU 上指定某些内容,或者使用 128 位的纹理 float4s 是否会自动转换为 halfs?如果我传入带有 bgra8format 的纹理,那么反过来呢?我之所以问,是因为我正在尝试使用 MTKTextureLoader 以及从纯字节数据加载纹理,并且我不确定纯字节数据使用什么格式,所以事情是一致的。我可以澄清一下吗?

【问题讨论】:

    标签: graphics textures metal metalkit


    【解决方案1】:

    这真的取决于你的用例。

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

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

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

    一般来说,您应该使用适合您用例的最小内存占用的纹理格式。

    【讨论】:

    • 这有帮助。我没有意识到 Metal 会执行转换。为了澄清起见,我的目标是最近的 iPad 型号(如此移动)。根据您的回答中的一些要点,仅提出几个后续问题:1:如果我想要最佳性能,片段着色器的返回类型也应该是一半吗? 2:如果我从 png 加载纹理,我应该假设它们是 SRGB 吗? (MTKTextureLoader 有一个字段来指定这一点。) 3:如果我在视图上使用多重采样,这是否意味着所有纹理都需要在着色器中进行多重采样和特定类型的采样器?
    • 1.我认为最好在任何地方使用half,除非你真的需要float 精度。 2. 这取决于您的图像是线性还是 sRGB 伽马曲线。我认为如果您不通过该选项,加载程序会选择正确的选项。 3. 我不这么认为,但我不是 MSAA 方面的专家。据我了解,您只需渲染到视图的multisampleColorTexture,它就会自动解析。
    • 谢谢。有时很难找到有关 Metal deapite 的答案,因为它已经存在了一段时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 2018-08-12
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多