我为一个项目编写了一个带有两个定向灯的简单Phong着色器,并注意到照明中有令人不快的伪影。如果两个灯都照亮同一区域,则在N.L达到零的光终结器处会出现暗带。起初我以为这一定是我的代码中的错误,但是快速测试发现Unity标准着色器也存在完全相同的问题。




我最好的猜测是,这是马赫效应的某种形式,而我们的视网膜在亮度平稳的地方过冲。有谁知道有什么技巧可以减轻这种影响?

为清晰起见,请编辑以下图片:

这里还有另外两张图像可以更好地说明这种效果-一个是我的着色器,另一个是Unity的漫反射着色器,在90度的灯光下,所有镜面反射和周围环境的影响都被移除。



您可以清楚地看到右上象限周围的暗带,其中一个光的终结器与另一个光的影响区域相交(嗯,我还是可以,YMMV)。我在上面滴了一支吸管,并确认这是一种可感知的效果,像素实际上并没有变暗。

评论

是否在线性色彩空间中呈现?

您实际上有两个相距180度的灯吗?它应该在光终结器处变暗,但通常不会在另一侧再次发光,除非您打开了双面照明并且关闭了阴影,或者在相反的两个面上都没有照明。

PaulHK尝试了两者,但效果仍然存在,尽管在线性方面不太明显。

丹,看看照片。灯光之间的距离更像是60度,问题是当一个灯光的贡献达到零时,它似乎对另一个灯光产生了负面的影响-可能只是感知的伪像,但仍然很烦人。

不幸的是,这是朗伯照明模型的正确结果。摆脱它的物理上有效的方法是用面光源替换点光源。或者,如果您不关心正确性,则可以使用其他函数替换$ \ max(n \ cdot \ ell,0)$步骤,以使在$ n \ cdot \ ell = 0 $处的纽结平滑。 />