使用MTLPixelFormat.rgba16Float等格式时图像出现随机舍入误差问题
Metal非整数像素格式渲染到CAMetalLayer的噪点问题
问题现象:使用Metal计算管线渲染到CAMetalLayer的drawable时,采用非整数像素格式会出现明显舍入误差,导致图像带有细微噪点:
- 目标格式为
.rgba16Float时存在该问题; - 定点格式
.bgr[a]10_xr[_srgb]也会出现可见噪点; - 默认的
.bgra8Unorm等整数格式则始终能输出预期的纯色效果。
- 目标格式为
测试验证:通过对比Demo(左右两个基于CAMetalLayer的区域),所有像素均填充
float4(0.5f, 0.5f, 0.5f, 1.0f):- 左侧使用
.bgra8Unorm,显示纯色; - 右侧使用
.rgba16Float,用Digital Color Meter检测可见微小颜色波动。
- 左侧使用
![]()
核心疑问
即使着色器仅写入常量值,为何会出现空间不均匀性?是使用方式有误?还是Apple的Bug?当前API能否保证空间一致的舍入行为?
编辑1
- Metal支持通过
-ftexture-write-rounding-mode编译器标志指定纹理写入的舍入模式,可选值包括native(默认)、rte(四舍五入到最近偶数)、rtz(向零舍入); - 测试三种模式后均无效果,推测问题出现在着色器写入纹理之后的处理逻辑阶段。
编辑2
- 将图层的
wantsExtendedDynamicRangeContent设置为true后,噪点问题得到解决; - 该属性的文档描述仅提及影响钳位行为,但实际启用EDR后,合成过程采用了更高精度的转换算法,与文档描述不符。
内容的提问来源于stack exchange,提问作者Marcel Tesch
相关产品推荐
相关产品推荐

