经验证,原来ddx、ddy这两个操作,在forward rendering与deferred rendering中存在着很微妙的语义区别。
在forward rendering中,GPU shader会自动地判断其2x2区域是否仅有部分落在当前绘制的三角面所覆盖的interpolate范围内。
而在dr中,在将ddx/ddy操作应用于一个NDC quad时,GPU shader这一免费的“非法校验”操作便失效了。用于计算ddx/ddy的2x2像素区域有可能一部分位于三角面A、而另一部分则位于三角面B。也就是说:参与ddx/ddy运算的像素,有可能超出了同一三角面的插值范围,从而导致ddx/ddy得到错误的结果。从而导致模型edge上的artifact。这一问题在dr中使用像素world坐标重建几何法线时(normalize(cross(ddx(posW), ddy(posW)))),尤为突出,而且真正理解上述原因的人少之又少。
总结:使用ddx/ddy,切记一定要确保其2x2区域位于同一三角面的光栅化范围内,不能跨三角面。在DR中,GPU shader不会自动地保障上述前提成立,所以没有引入其他额外机制的前提下,只能避免使用ddx/ddy计算几何法线。
附图1:deferred rendering,使用ddx/ddy重建法线,存在artifacts
附图2:forward rendering,使用ddx/ddy计算法线,不存在artifacts
时间: 2024-12-03 06:38:17