iOS Metal - 我可以对顶点位置和颜色使用降低精度的半值吗?

问题描述

我正在尝试在 Metal 中渲染点云时节省内存。我看到一个教程,建议使用半类型(可能在 Mac 上)。在 iOS 上使用 Metal 渲染时,我想尝试返回顶点位置和颜色的一半,但出现以下错误

我看到Apple says that position and color have to be float here.

有没有办法将 Metal 渲染配置为接受位置和颜色的半值?

struct ParticLevertexOut {
    half4 position [[position]]; //Type 'half4' (vector of 4 'half' values) is not valid for attribute 'position'
    half pointSize [[point_size]]; // Type 'half' is not valid for attribute 'point_size'
    half4 color;
};

解决方法

简短的回答是否定的,你不能。

长答案是:如果你查看 Metal Shading Language Specification,表 5.3。顶点函数返回类型的属性,[[position]]只能有float4类型,同[[point_size]]

我认为您无法在此处节省任何内存带宽,因为顶点输出进入平铺顶点缓冲区,至少在 Apple GPU 上是这样。除非您有太多几何图形并且它溢出到系统内存中,否则所有这些顶点数据都保留在芯片上并且不会占用任何额外空间。有一些关于它的讨论,比如 Harness Apple GPUs with Metal,WWDC20 更详细。

另外,在某些情况下,我认为 half 对屏幕空间坐标的精度不够,但我可能是错的。至于它必须保持 float 的其他可能原因,我想说是因为其他 GPU 供应商可能拥有更“固定”的顶点管道,但同样,不要引用我的话。>