光线追踪 - 柔和的阴影

时间:2015-07-29 19:21:30

标签: 3d shadow raytracing

我正在将自己的光线追踪器用作学校项目的iPad应用程序。目前这是结果:

enter image description here

我需要添加最后一个要求,软阴影,但我无法在任何地方找到完整的参考。如果我理解得很好,为了实现这个功能,我必须从交叉点射击许多光线到光源。这一个必须是区域灯。假设我使用了一个球体,我的问题是:

  • 我必须使用哪个点来计算阴影射线?
  • 我如何平均结果?

1 个答案:

答案 0 :(得分:9)

您正站在具有局部表面法线N的点P处,并且需要找出来自球形光源L的照明,其中心C悬挂在地平线上方,均匀且愉快地在可见频率上辐射能量。要获得柔和阴影,您需要向L上的不同点发送多个遮挡探测器光线(阴影衰减器),但让我们做的不仅仅是这样。

The scene

图片清楚地表明,直射光只能从半球H F 到达P,所以它是你必须采样的球体的唯一部分 - 发送shadowfeelers到 - 准确地评估L对P的照度的贡献。然而,虽然在球体上生成点很简单,但是在这里我们只有一个半球不必与任何世界坐标轴对齐,这使得数学变得复杂。但真正的问题在于其他地方 - 如果我们统一地采样H F ,我们将对其面向P头的部分以及几乎横向的部分给予相同的处理。这是一种浪费,将计算重点放在向P发送更多能量的区域上会更好。

我们快速观察一下,所有这些影子传感器实际上是针对与L共用中心的光盘D(即L的大圆),并且与连接P和C的线正交。

Disc noticed

这意味着我们不是在H F 上生成点,而是在盘D上生成它们,这不仅更简单,而且 - 假设D上的均匀点分布保证了shadowfeeler H F 上的密度将与区域的潜在贡献成正比,很好地解决了我们上面的问题。

另一种看待这种情况的方法是,你需要在一个圆锥体内生成光线,其中P为顶点,D为基底。

Cone enters

总结一下:

  1. 假设从L到P的一些总光量E可以基于L和P之间的距离,L在P上的角展度,或者更复杂的东西。
  2. 从P向光盘D生成一组M个随机均匀阴影射线。
  3. 如果射线R在击中L之前与任何物体相交,则沿该路径没有能量传递。
  4. 否则:
    • 将E / M乘以P处的法向量N的点积和(归一化的)R,
    • 将结果添加到目前为止传输的光线中。
  5. 重复所有M光线。
  6. TO DO:优化(检测L是否在局部视界下完全/部分,通过L在P上的角展度改变M,使用分层和/或自适应采样,缓存封堵器命中等)。

    PS。上面做了大量的假设和简化,并且光度测量不正确,但应该用于iPad射线追踪器。