这被称为 “癌症”,这是由于从表面发射阴影光线,但光线再次与该表面相交而引起的伪影。结果是物体的某些东西挡住了光线,而不知道物体本身在阴影的来源处做到了这一点。这是浮点精度误差的自然结果。
解决该问题的最简单方法之一是引入“epsilon”值,并且不计算低于该阈值的交集。这允许更复杂的几何体自相交,但有点脏。
更一般地,您可能决定将反射光线的对象排除在光命中测试中。在更广义的 3D 场景中,一切都是三角形,您可以排除该三角形。但在大量镶嵌的场景中,当您碰到相邻的三角形时,您可能会再次遇到该问题。
另一种方法是,如果表面法线指向与阴影光线相同的方向,则忽略相交。如下所示,仅当两者的点积不为负时才计算交集。
实际上,结合使用上述措施通常可以解决此问题,但您也可以只选择其中一项。