通过透明表面计算阴影

时间:2011-01-03 16:33:25

标签: graphics shader raytracing

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

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

是否有快速而好的方法来近似颜色,或者我应该将表面的颜色作为浅色及其透明度作为强度?

2 个答案:

答案 0 :(得分:3)

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

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

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

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

对于半透明物体,我会将光强度的降低模拟为距离的线性函数(大多数现实世界的物体与此假设密切相关)。如果您将光建模为具有RGB分量(物理上不真实......),那么您将减少每个分量与该分量在对象内的值成比例。

如果你想要在物体中使用光线的方式非常先进,那么你需要转向subsurface scattering(玻璃杯中的牛奶看起来不像白色固体,为什么人类会这样做很难在CGI中建模。

编辑:你提到的光无限地来回反复并使用许多计算的现象就是真光的表现。如今的高级渲染器无法集成所有这些光组件,因此可以随机采样光分布。采集的样本越多,图像越接近逼真,光整合越接近其真实值。这称为蒙特卡罗渲染。路径跟踪,双向路径跟踪和大都市光传输都是蒙特卡罗算法,试图完全模拟光传输。在给定足够时间的情况下,每个算法将收敛到相同的最终图像,然而,一些算法比其他算法更有效。 (请参阅维基百科上的path tracing。文章底部的图像比我试图绘制的图像更好。)

答案 1 :(得分:0)

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

请注意,有一种近似无限光芒树的好方法,它采用彩色名称“俄罗斯轮盘”:当树的任何分支变得过于不重要时,随意选择是否修剪它。分支以概率P进行修剪,并对结果贡献零(它们“死”并且不需要计算)。幸存的分支(“获胜者”)将其贡献乘以1/(1-P),以便得到的近似值平均正确。

俄罗斯轮盘赌是一种蒙特卡罗技术;您可能需要查看蒙特卡罗光线跟踪和其他global illumination方法。