一个华为手机上的Bug
今天查一个 辉光抖动 的问题:我们一个PBR的摩托车,在开辉光后高光处闪烁的厉害,并且这个闪烁只出现在华为手机上(Mali GPU)。
用RenderDoc分析了一下,闪烁处的高光值已经逆天了,如下图:
由上图可见,红框标记的颜色值达到了 65504,由于我们开启了 FP16 HDR,这里的 65504 刚好是 FP16 能表示的最大值。
0 11110 1111111111=(-1)^0 * 2^15 * (1+1-2^-10)=65504
直觉上这里是 浮点数精度 的问题,因为之前没少吃 Mali GPU 的亏,:)
修正
要堵这个问题很简单,只需要对最终的高光值用 clamp大法 即可。
不过作为一个强迫症患者,我还是想找到具体是哪里出了问题,于是做了一番调试,最后发现问题代码如下:
half perceptualRoughness = SmoothnessToPerceptualRoughness(smoothness);
half roughness = PerceptualRoughnessToRoughness(perceptualRoughness);
half V = SmithJointGGXVisibilityTerm(NoL, NoV, roughness);
half D = GGXTerm(NoH, roughness);
half specularTerm = V * D * UN