光线跟踪阴影问题

时间:2009-12-09 20:07:26

标签: raytracing shadow

我的光线跟踪器中有阴影的问题。

请看下面两张图片

3D sMax:

alt text http://neo.cycovery.com/shadow_problem.gif

我的Raytracer:

alt text http://neo.cycovery.com/shadow_problem2.jpg

场景被一道非常明亮的灯光照亮,从后面照射。它非常明亮,阴影中没有渐变,只有白色或深色(由于过度曝光)。

两个图像都是使用3DStudioMax渲染的,两者都使用完全相同的几何图形,只有在一种情况下,法线在三角形中进行插值。

现在考虑表面上的红点。在未平滑版本的情况下,它位于黑暗区域。这意味着从这个三角形看不到光源,因为它背对着它。 然而,在平滑的版本中,它位于被照亮的区域中,因为插值法线会表明在该点处可见光(尽管三角形的实际几何形状背离光源)。

现在我的问题是当光线追踪阴影进来时。如果从场景中射出阴影,从红点开始,测试光源是否可见(确定阴影),阴影将返回一个交叉点,与是否插入法线无关(因为交点仅取决于几何)。因此,像素将被遮挡黑暗。

3dsamx正确处理案例 - 渲染的图像是在启用光线跟踪阴影的情况下生成的。然而,当我打开光线跟踪阴影时,我自己的Raytracer会完全运行这个问题(在我的光线跟踪器中,两种情况下点都是暗的,因为光线跟踪的阴影决定了阴影中的​​点),我不知道如何解决它

我希望有人知道这个问题,以及如何处理它......

谢谢!

5 个答案:

答案 0 :(得分:3)

'正确'的解决方案要么是三角形,要么是三角形所属的曲面方程。我只看到了曲面细分。曲面细分为您提供可控的精度等等。
否则,您应该在该点测试正常(我相信'3DStudio'所做的),并且在法线不面向光的情况下,只需将该点设置为不亮。它与“自我阴影”无关。很容易这个问题只能通过曲面细分来解决。祝你好运!

答案 1 :(得分:0)

我不确定我是否正确理解了你的问题。 很难通过哪种方法获得哪个版本/结果以及结果如何 考虑正确。

当你需要与三角形的暗影交叉时,情况不是这样的 红点;-)就是特例。 与其他任何三角形一样,您不进行几何交叉, 但只能在插值法线和阴影线之间进行方向检查。

或者在更一般的意义上,你说shadowray停在一个三角形,任何三角形,当: a)他们相交和 b)交点处三角形的插值法线与shadowray相反。

答案 2 :(得分:0)

你如何做到: 如果该点处的内插法线面向光,则表面可能面向光。如果面对你,你就在阴影中。

在第一种情况下,导致阴影的两件事是其他物体,如果你是凹物体则自己。在另一个容易的对象中。

现在在你自己的情况下,当你将光线投射到光源时,如果你真的是“凸出的内部点”,你会在进入时自己击中两次然后离开物体,因此在阴影中。

如果你一次击中自己,那么你必须处于光线照射的边缘,但正如我们所知,我们正面对光线(通过平滑的法线),这意味着我们不会被遮蔽。

答案 3 :(得分:0)

Mat,我相信你的问题可能是你的阴影光线碰到它起源的同一个三角形,因为它非常接近切向(注意它恰好发生在光影过渡的边界上)。有两种方法可以解决这个问题:一种方法是使用“偏差”来测试距射线原点的距离,但我认为更好的解决方案是用射线存储对原始三角形的引用。如果对这个三角形进行测试,只需忽略它。

如果您碰巧使用像BVH这样的空间索引,那么在进行任何相交测试之前,您可以尝试走出包含三角形的“框”,但这不如之前提到的方法简单,必须接近更加小心。

答案 4 :(得分:0)

在发射阴影射线时,在光源方向上移动一小段交叉点是正常的。

即。 shadowRay.dir = shadowRay.dir * 0.0001

这可以避免阴影射线与主/反射/折射射线相同的基元相交。

也许你的问题是因为你没有这样做?

相关问题