光线追踪 - 软阴影
Ray tracing - soft shadow
我正在实施我自己的光线追踪器作为学校项目的 iPad 应用程序。目前这是结果:
我需要添加最后一个要求,软阴影,但我无法在任何地方找到完整的参考。如果我理解得很好,要实现此功能,我必须从交叉点向 mt 光源发射许多光线。这个必须是区域灯。假设我使用一个球体,我的问题是:
- 我必须使用球体上的哪个点来计算阴影光线?
- 如何计算结果的平均值?
你站在一个局部表面法线为N的点P,需要找出球形光源L到达的光照,中心C悬在horizon上方,在可见光上均匀而愉快地辐射能量频率。要获得柔和的阴影,您需要向 L 上的不同点发送多个遮挡检测器射线(shadowfeelers),但我们要做的不止于此。
图片很清楚直射光只能从 HF 半球到达 P,所以它是你唯一需要采样的球体部分 - 发送 shadowfeelers到 - 为了准确评估 L 对 P 处照明的贡献。然而,虽然在球体上生成点很简单,但这里我们只有一个半球,它不一定与任何世界坐标轴对齐,这使数学复杂化。但真正的问题在别处——如果我们对 HF 进行均匀采样,我们将对它正面对着 P 的部分和几乎侧面的部分给予同等对待。这是一种浪费,最好将我们的计算集中在向 P 发送更多能量的区域。
我们快速观察一下,所有这些 shadowfeelers 实际上都是针对与 L 共享中心(即 L 的大圆)并且垂直于连接 P 和 C 的线的圆盘 D。
这意味着我们可以在圆盘 D 上生成它们,而不是在 HF 上生成点,这不仅更简单,而且 - 假设点分布均匀D - 保证 HF 上的 shadowfeeler 密度将与该区域的潜在贡献局部成比例,很好地解决了我们上面遇到的问题。
另一种看待这个问题的方法是,您需要在以 P 为顶点、以 D 为底的圆锥内生成光线。
总结一下:
- 假设从 L 到达 P 的光 E 总量。您可以基于 L 和 P 之间的距离,angular L 在 P 上的扩散,或者更复杂的东西。
- 生成一组从 P 到圆盘 D 的随机均匀阴影射线。
- 如果光线 R 在击中 L 之前与任何物体相交,则沿着这条路径没有能量传递。
- 否则:
- 将E/M乘以法向量N在P和(归一化)R的点积,
- 将结果添加到到目前为止传输的光中。
- 对所有 M 射线重复。
待办事项:优化(检测 L 在局部 horizon 下是否 fully/partially,随着 L 在 P 上的 angular 分布变化 M,使用分层 and/or 自适应采样、缓存遮挡器命中等)
PS。上面做了很多假设和简化,并且在光度学上是不正确的,但应该适用于 iPad 光线追踪器。
我正在实施我自己的光线追踪器作为学校项目的 iPad 应用程序。目前这是结果:
我需要添加最后一个要求,软阴影,但我无法在任何地方找到完整的参考。如果我理解得很好,要实现此功能,我必须从交叉点向 mt 光源发射许多光线。这个必须是区域灯。假设我使用一个球体,我的问题是:
- 我必须使用球体上的哪个点来计算阴影光线?
- 如何计算结果的平均值?
你站在一个局部表面法线为N的点P,需要找出球形光源L到达的光照,中心C悬在horizon上方,在可见光上均匀而愉快地辐射能量频率。要获得柔和的阴影,您需要向 L 上的不同点发送多个遮挡检测器射线(shadowfeelers),但我们要做的不止于此。
图片很清楚直射光只能从 HF 半球到达 P,所以它是你唯一需要采样的球体部分 - 发送 shadowfeelers到 - 为了准确评估 L 对 P 处照明的贡献。然而,虽然在球体上生成点很简单,但这里我们只有一个半球,它不一定与任何世界坐标轴对齐,这使数学复杂化。但真正的问题在别处——如果我们对 HF 进行均匀采样,我们将对它正面对着 P 的部分和几乎侧面的部分给予同等对待。这是一种浪费,最好将我们的计算集中在向 P 发送更多能量的区域。
我们快速观察一下,所有这些 shadowfeelers 实际上都是针对与 L 共享中心(即 L 的大圆)并且垂直于连接 P 和 C 的线的圆盘 D。
这意味着我们可以在圆盘 D 上生成它们,而不是在 HF 上生成点,这不仅更简单,而且 - 假设点分布均匀D - 保证 HF 上的 shadowfeeler 密度将与该区域的潜在贡献局部成比例,很好地解决了我们上面遇到的问题。
另一种看待这个问题的方法是,您需要在以 P 为顶点、以 D 为底的圆锥内生成光线。
总结一下:
- 假设从 L 到达 P 的光 E 总量。您可以基于 L 和 P 之间的距离,angular L 在 P 上的扩散,或者更复杂的东西。
- 生成一组从 P 到圆盘 D 的随机均匀阴影射线。
- 如果光线 R 在击中 L 之前与任何物体相交,则沿着这条路径没有能量传递。
- 否则:
- 将E/M乘以法向量N在P和(归一化)R的点积,
- 将结果添加到到目前为止传输的光中。
- 对所有 M 射线重复。
待办事项:优化(检测 L 在局部 horizon 下是否 fully/partially,随着 L 在 P 上的 angular 分布变化 M,使用分层 and/or 自适应采样、缓存遮挡器命中等)
PS。上面做了很多假设和简化,并且在光度学上是不正确的,但应该适用于 iPad 光线追踪器。