1

我正在研究光线追踪器,但我不确定如何将局部照明(phong)与反射和折射结合起来?我有用于计算的 TraceRay 函数:localLighting、reflectColor 和 refractColor。

在这一点上,我的最终颜色只是这三个的总和。但这样我得到的值超过 1,我不知道如何处理。

谢谢你的帮助

4

1 回答 1

0

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

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

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

对于反射和折射,我知道的唯一方法是通过路径追踪。此链接上的 PDF描述了总体思路,以及一种相关的优化,称为 Metropolis Light Transport。本质上,您需要做的是递归光线投射:您需要继续从交叉点(即通常在该像素处渲染的点)投射光线,而不是仅仅从眼睛投射到像素中并进入场景随机进入场景以创建由多条线段组成的光路,每条线段连接场景中的两个交点,或者连接一个与您的眼睛或一个光源的交点。然后,您可以跟踪光源从每个点反射的路径,并计算进入路径的光(每种颜色的)有多少将在每个点反射到下一段。您可以使用模型的 BSDF 来计算这一点,该模型可以使用 Phong 或任何其他反射模型进行近似。最终结果告诉您有多少进入路径的光将到达当前像素。

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

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

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

于 2012-12-04T13:16:09.203 回答