光线追踪 - 柔和的阴影

Fab*_*oni 2 3d raytracing shadow

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

在此输入图像描述

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

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

Mil*_*myk 9

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

现场

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

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

光盘注意到了

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

另一种看待这种情况的方法是,您需要在锥体内生成光线,其中P为顶点,D为基础.

锥进入

把它们加起来:

  1. 假设从L到P的一些总光量E可以基于L和P之间的距离,L在P上的角展度,或者更复杂的东西.
  2. 从P向盘D生成一组M个随机均匀阴影射线.
  3. 如果射线R在击中L之前与任何东西相交,则沿着该路径没有能量传递.
  4. 除此以外:
    • 将E/M乘以P处法线向量N和(归一化)R的点积,
    • 将结果添加到目前为止传输的光线中.
  5. 重复所有M射线.

要做的是:优化(检测L是否在局部视界下完全/部分,通过L在P上的角展度变化M,使用分层和/或自适应采样,缓存封堵器命中等)

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