SIM*_*MEL 8 graphics shader raytracing
在光线跟踪中,我想计算光线照射点的阴影.我向所有光源"绘制"线条并检查它们是否被物体阻挡.如果它们没有被阻挡,那么我根据它们的强度和"命中光线"与表面法线之间的程度来计算光照强度.
但如果光被部分透明的表面阻挡怎么办?然后光应该点亮这个点,但是它的强度和颜色会受到它通过的表面颜色的影响,并且为了计算我需要对光线通过的点进行光线追踪(实际上对于2个点,一个入口和一个出口),这将是非常昂贵的,并且可能几乎永远不会结束(我想在光源和表面的正确定位中,您可以将示踪剂置于几乎无限的每次击中循环).
是否有一种快速而好的方法来近似颜色,或者我应该将表面的颜色作为浅色和透明度作为强度?
您不需要从入口点和出口点开始进行光线追踪。想想什么样的光照射到这些点上。以与击中目标对象不同的角度击中半透明表面的光线不会影响击中目标对象的光线的颜色。
+ * +
+ * +
+ * +
+ * +
----------
| +*+ |
| + * + |
| + * + |
----------
+ * +
*
*
-------
Run Code Online (Sandbox Code Playgroud)
当然,这是假设材料中不存在折射。
现在,如果您想将光线追踪器扩展到更高级的功能(例如路径追踪),那么您需要考虑从半透明物体反射并击中最终物体的光线,但对于光线追踪器,您不需要这样做担心它。
对于半透明物体,我将光强度的下降建模为距离的线性函数(大多数现实世界的物体都严格遵循这一假设)。如果您将光建模为具有 RGB 分量(物理上不现实......),那么您将按照对象内该分量值的比例减少每个分量。
如果你想真正深入了解光在物体中的作用,那么你需要转向次表面散射(玻璃中的牛奶看起来不像白色固体的原因以及为什么人类很难在 CGI 中建模) )。
编辑:你提到的光无限地来回弹跳并使用许多计算的现象就是真实光的行为。现在的高级渲染器不可能集成所有这些光分量,因此而是随机采样光分布。采集的样本越多,图像就越接近真实感,光积分也越接近其真实值。这称为蒙特卡罗渲染。路径追踪、双向路径追踪和大都市光传输都是试图完全模拟光传输的蒙特卡罗算法。如果有足够的时间,每种算法都会收敛到相同的最终图像,但是有些算法比其他算法更有效。(请参阅维基百科上的路径跟踪。文章底部的图像比我尝试绘制的图像更好)。