3

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

请看下面两张图片

3D 最大:

替代文字 http://neo.cycovery.com/shadow_problem.gif

我的光线追踪器:

替代文字 http://neo.cycovery.com/shadow_problem2.jpg

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

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

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

我现在的问题是当光线跟踪阴影进入时。如果从红点将阴影光线射入场景,以测试光源是否可见(以确定阴影),阴影光线将返回一个相交,与法线是否被插值(因为交点只取决于几何)。因此,像素会变暗。

3dsamx 正在正确处理这种情况 - 渲染图像是在打开光线跟踪阴影的情况下生成的。然而,当我打开光线追踪阴影时,我自己的光线追踪器恰好遇到了这个问题(在我的光线追踪器中,这两种情况下的点都是黑暗的,因为光线追踪阴影决定了位于阴影中的点),我不知道如何解决它。

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

谢谢!

4

5 回答 5

3

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

于 2009-12-15T16:19:55.667 回答
0

我不确定我是否正确理解了您的问题。很难获得通过哪种方法获得的版本/结果以及您认为正确的结果。

当您需要威胁 shadowray 与 Red Point ;-) 所在的三角形相交时,情况并非如此。与任何其他三角形一样,您不会进行几何相交,而只会在插值法线和阴影射线之间进行方向检查。

或者在更一般的意义上,你说shadowray在一个三角形上停止,任何三角形,当:a)它们相交并且b)在交叉点处三角形的插值法线具有与shadowray相反的方向。

于 2009-12-09T21:41:15.020 回答
0

如何做到这一点:如果该点的插值法线朝向灯光,则表面可能朝向灯光。如果背对着你,你就在阴影中。

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

现在就你自己而言,当你将光线投射到光源时,如果你真的是“内凸点”,你会在进入时击中自己两次,然后离开物体,从而进入阴影。

如果您单次击中自己,那么您必须位于光线照射的边缘,但正如我们所知,此时我们正面对光线(通过平滑法线),这意味着我们没有被阴影覆盖。

于 2009-12-10T03:08:45.447 回答
0

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

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

于 2009-12-21T12:00:11.920 回答
0

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

即shadowRay.dir = shadowRay.dir * 0.0001

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

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

于 2010-08-13T14:25:38.820 回答