【问题标题】:Raytraced Shadows Problem光线追踪阴影问题
【发布时间】:2009-12-09 20:07:26
【问题描述】:

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

请看下面两张图

3D 最大:

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

我的光线追踪器:

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

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

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

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

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

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

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

谢谢!

【问题讨论】:

  • 你在做正常的平滑吗?位置是空间基于几何图形,但阴影状态基于与光源的角度,这是基于表面法线的,因此如果您不平滑法线,您将在三角形上拥有相同的法线。
  • 什么意思?正如我所说,我在三角形上插入法线!问题不在于阴影!问题是光线追踪的阴影!如果我关闭光线追踪阴影,一切看起来都很好(当然,除了没有阴影!)
  • Mat,能否再附两张图:只有 RT-shadow 没有阴影和只有 RT-shading 没有阴影?

标签: raytracing shadow


【解决方案1】:

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

【讨论】:

  • +1 仅用于细分到所需的精度 :-) 我曾经读到皮克斯细分为亚像素三角形,这应该完全消除了插入法线的需要。这并不容易,但也不是黑客。
  • 对于这样一个小问题,镶嵌听起来非常昂贵。如果您根据法线弯曲曲面并从该点射出阴影光线,您将获得完美的结果。使用曲面细分来解决难题,例如置换贴图。
  • @sapanoia:对于这种特殊情况是的,但你会打赌更扭曲的一个吗?无论如何,我同意你的观点,对于简单的情况,可以使用更简单的解决方案。 (顺便说一句,“弯曲表面”是指法线的插值还是更复杂的东西?)
  • @avp:我想我的想法最终需要求解曲面方程。但是,这可能太昂贵了,这可能是通常实施镶嵌的原因。
【解决方案2】:

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

当你需要威胁shadowray与三角形的交点时,不是这样吗? 红点 ;-) 是特例。 你不做几何相交,就像任何其他三角形一样, 但只有插值法线和阴影线之间的方向检查。

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

【讨论】:

  • 嗨!我认为平滑的 3dsmax 结果是正确的,并且希望得到相同的结果。不幸的是,我不能只将当前三角形视为特例。如果当前三角形背对光源,那么shadowray会被射到我的物体上,因为它要进去,所以它必须再次出去,所以离开物体时它会碰到另一个三角形
  • 为什么还要考虑对象内部与三角形的交点?无论如何,我用更通用的方法更新了我的答案。对不起。我已经很久没有编写这些东西了。
  • 如果我在投射阴影光线时不考虑背面多边形,那么例如一个平面就不能将阴影投射到另一个平面上
  • 但是对于平滑的对象,它会更加复杂,如您所见......平面可以有一些特殊的两侧表面标志,或者可以简单地由两个面向相反方向的平面组成。
  • 这听起来像个 hack.. 必须有一些普遍有效的技术来处理这个问题
【解决方案3】:

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

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

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

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

【讨论】:

  • 以上假设您没有对光源的对象进行背面剔除。如果你这样做了,那么就不会有交叉点。我认为这是 Tomek 的观点。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

    即shadowRay.dir = shadowRay.dir * 0.0001

    这样可以避免阴影光线与主光线/反射光线/折射光线相交。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 2021-03-17
      相关资源
      最近更新 更多