8

在光线追踪中,我想计算光线命中点的阴影。我在所有光源上“画”线并检查它们是否被物体阻挡。如果它们没有被阻挡,那么我会根据它们的强度以及“命中光线”与表面法线之间的程度来计算照明的强度。

但是,如果光线被部分透明的表面挡住了怎么办?那么光线应该会来照亮这个点,但是它的强度和颜色会受到它通过的表面颜色的影响,为了计算我需要对光线通过的点进行光线追踪(实际上对于 2 点,一个入口和一个出口),这将非常昂贵,并且可能几乎永无止境(我猜在正确定位光源和表面时,您可以将示踪剂置于几乎无限每次命中循环)。

有没有一种快速而好的方法来近似颜色,或者我应该只将表面的颜色作为光色,将其透明度作为强度?

4

2 回答 2

3

您不需要从入口点和出口点开始进行光线追踪。想想什么样的光击中了这些点。以不同于照射目标物体的角度照射半透明表面的光线不会影响照射到目标物体的光线的颜色。

+     *     +
 +    *    +
  +   *   +
   +  *  +
 ----------
|    +*+   |
|   + * +  |
|  +  *  + |
 ----------
 +    *    +
      *
      *
   -------

当然,这假设材料中没有折射。

现在,如果您想将光线追踪器扩展到更高级的东西,例如路径追踪,那么您需要考虑从半透明物体反弹并击中最终物体的光线,但对于光线追踪器,您不需要这样做担心它。

对于半透明物体,我会将光强度的降低建模为距离的线性函数(大多数现实世界的物体都遵循这个假设)。如果您将灯光建模为具有 RGB 组件(不是物理上真实的......),那么您将根据对象内该组件的值按比例减少每个组件。

如果您想真正了解光线在物体中的作用,那么您将需要转向次表面散射(玻璃中的牛奶看起来不像白色固体的原因以及为什么人类很难在 CGI 中建模)。

编辑:您提到的光无限地来回反弹并使用许多计算的现象是真实光的行为。现在的高级渲染器不可能集成所有这些光组件,而是随机采样光分布。采集的样本越多,图像越接近真实,光积分越接近其真实值。这称为蒙特卡罗渲染。路径追踪、双向路径追踪和都市光传输都是试图完全模拟光传输的蒙特卡罗算法。每个算法,只要有足够的时间,都会收敛到相同的最终图像,但是,有些算法比其他算法更有效。(见路径追踪在维基百科上。在文章的底部是一张比我试图画的更好的图像)。

于 2011-01-03T22:09:03.980 回答
1

如果您想要既可以进行常规着色又可以进行透明的表面,最简单的方法是忽略阴影光线的常规着色:出于照明目的,仅使用透明表面的过滤属性。这避免了您描述的潜在的无限照明计算。

请注意,有一种近似无限光线树的好方法,它的名字叫“俄罗斯轮盘赌”:当树的任何分支变得太不重要时,随机选择是否修剪它。分支被概率修剪P并且对结果的贡献为零(它们是“死的”并且不需要计算)。幸存的分支(“获胜者”)的贡献乘以1/(1-P),因此得到的近似值平均是正确的。

俄罗斯轮盘赌是一种蒙特卡洛技术;您可能想研究蒙特卡洛光线追踪和其他全局照明方法。

于 2011-01-03T22:11:15.080 回答