如何将局部照明与反射和折射相结合?

时间:2012-11-22 23:12:36

标签: game-physics raytracing

我正在研究光线跟踪器,我不知道如何将局部照明(phong)与反射结合起来 和折射?我有TraceRay函数,我在其中计算:localLighting,reflectColor和refractColor。

此时我的最终颜色只是这三种颜色的总和。但是这样我得到的值超过1,我不知道如何处理这个问题。

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

这是两个独立的问题:如何处理反射/折射,以及如何处理大于1的颜色值。

我会先解决第二个问题,因为它更容易。这不是错误,它是一种称为饱和的效果,或者可能是过度曝光。它发生在电影和数码相机中,也发生在你眼中。问题很简单,就是你有足够的光能到达你的感光器(在眼睛的情况下,或数码相机中的CCD,或胶片相机中的光敏化合物),受体已经饱和到它的最大输出值。换句话说,你可以继续倾注更多的能量,但受体将无法输出任何更强的信号,所以它看起来会一样。因此,简单的解决方案是简单地将所有颜色值饱和到1.0,这模仿真实感光器中发生的情况。

当然,当你的眼睛发生这种情况时,你的瞳孔会收缩,因此没有那么多的光进入,而当摄影师有过度曝光的照片时,他们可能会因同样的原因减少光圈或曝光时间。您只需将每个像素的颜色值除以固定量即可在渲染器中执行相同操作。这类似于收缩瞳孔或限制暴露时间以减少到达每个受体的光能量。

对于反射和折射,我所知道的唯一方法是通过路径追踪。 this link处的PDF描述了一般概念,以及称为都市光传输的各种相关优化。基本上你需要做的是递归射线投射:你不需要从眼睛穿过像素投射到场景中,而是需要继续从交叉点投射光线(即通常在那个像素处渲染的点)随机进入场景以创建由多个线段组成的光路,每个线段连接场景中的两个交叉点,或者连接与您的眼睛或光源的交叉点。然后,您可以跟踪来自光源的路径,因为它从每个点反射,并计算出进入路径的光(每种颜色)的光量将反射到每个点的下一个分段。您可以使用模型的BSDF来解决这个问题,它可以使用Phong或任何其他反射模型进行近似。最终结果告诉您进入路径的光线有多少会到达当前像素。

对于每个像素,您需要构建许多这样的光路径,并让它们都有助于该像素的渲染值。这再次模拟了一个真实的光学系统:来自场景的光线从所有不同方向的每个点反射,并从您可能通过场景找到的每条可能的路径进入您的眼睛。路径追踪的想法是对这组所有可能的光路进行采样,以便估算整个集合的贡献。

现在关键是你真正想要的是集合中所有路径的总和,而不必实际跟踪每一条路径(理论上它们的数量无限)。因此,您可以执行一个统计技巧:如果您根据构建该特定路径的概率划分构建的每个路径的光值,则该商的期望值实际上是就像你想要的那样,整个路径上的光值。当然,这只是预期的值,所以用单一路径获得它的机会很小,但是如果你随机选择很多路径并执行相同的计算,那么为每条路径取这个商的平均值,你应该收敛朝着理想的解决方案。

这就是一般的想法,我链接的文档详细介绍了如何计算每个路径的光值和概率,以及如何选择构建路径的一些想法。请注意,可能令人困惑的是,您根据概率构建路径的方式定义了选择每条路径的概率。