我正在将自己的光线追踪器用作学校项目的iPad应用程序。目前这是结果:
我需要添加最后一个要求,软阴影,但我无法在任何地方找到完整的参考。如果我理解得很好,为了实现这个功能,我必须从交叉点射击许多光线到光源。这一个必须是区域灯。假设我使用了一个球体,我的问题是:
答案 0 :(得分:9)
您正站在具有局部表面法线N的点P处,并且需要找出来自球形光源L的照明,其中心C悬挂在地平线上方,均匀且愉快地在可见频率上辐射能量。要获得柔和阴影,您需要向L上的不同点发送多个遮挡探测器光线(阴影衰减器),但让我们做的不仅仅是这样。
图片清楚地表明,直射光只能从半球H F 到达P,所以它是你必须采样的球体的唯一部分 - 发送shadowfeelers到 - 准确地评估L对P的照度的贡献。然而,虽然在球体上生成点很简单,但是在这里我们只有一个半球不必与任何世界坐标轴对齐,这使得数学变得复杂。但真正的问题在于其他地方 - 如果我们统一地采样H F ,我们将对其面向P头的部分以及几乎横向的部分给予相同的处理。这是一种浪费,将计算重点放在向P发送更多能量的区域上会更好。
我们快速观察一下,所有这些影子传感器实际上是针对与L共用中心的光盘D(即L的大圆),并且与连接P和C的线正交。
这意味着我们不是在H F 上生成点,而是在盘D上生成它们,这不仅更简单,而且 - 假设D上的均匀点分布保证了shadowfeeler H F 上的密度将与区域的潜在贡献成正比,很好地解决了我们上面的问题。
另一种看待这种情况的方法是,你需要在一个圆锥体内生成光线,其中P为顶点,D为基底。
总结一下:
TO DO:优化(检测L是否在局部视界下完全/部分,通过L在P上的角展度改变M,使用分层和/或自适应采样,缓存封堵器命中等)。
PS。上面做了大量的假设和简化,并且光度测量不正确,但应该用于iPad射线追踪器。