whoimi

A geek blog

View on GitHub

体积云光照部分相关理论

阅读GPU Pro6当中的第4章体积云,主要为了记录其中和光相关的理论。《Real-Time Rendering of Physical Based Clouds Using Precomputed Scattering》

这篇文章主要提出了一种refrence Particle。通过缩放和旋转同一个粒子得到云。云可以有动画。

在与计算部分, 计算光学深度已经单个和多个的散射积分,用来描述光在rp当中的传递,描述了所有可能的摄像机位置和观察方向,并且存储在查找表当中。

原文:

we precompute optical depth as well as single and multiple scattering integrals describing the light transport in the reference particle for all possible camera positions and view directions and store the results in lookup tables.

在运行阶段,加载查找表,来估计光线在云当中的传递节省ray marching和slicing的开销。

主要原理来源于[Yusov 14b]

改进方案包括:

1.改进基于与计算查找表的着色模型。

2.使用3D网格来改进光线在云内部传递的衰减算分。

3.新的粒子生成算法

4.性能优化,包括给予GPU的粒子排序。

Light Transport Theory

这里介绍光线在粒子中传递的概念。

参考:More information can be found in [Riley et al. 04,Bouthors 08]

光在粒子当中有三个现象:

  1. 散射:改变粒子在介质中传播方向。
  2. 吸收:光子能量转换成了其他形式
  3. 发光:与吸收相反。

上述过程可以用Sc ,Ab,Em三个系数来描述。吸收散射 都是减少了光在介质中的强度。

消减系数:

在云内部 发散和吸收可以忽略 : , 所以散射和吸收可以用同一个系数描述:

光线在云内部,从A点到B点的衰减系数可以用下方公式描述:

表示光学深度,是从A点到B点消散系数B的积分。

=

$$ P=A+\frac{B-A}{ {B-A} } $$, s表示当前积分的点。

为了知道一个散射光的强度,我们需要沿着视线积累太阳光在每一个点上朝摄像机散射的所有分量。

参数解释表示摄像机位置,$\vec v$表示视线方向,表示视线进入和离开云的位置,表示某个散射位置的点,是光线到达散射位置的太阳光进入云的点。表示太阳光强度,表示入射方向到出射方向光损失的百分比。削减一共有两部分P到P0和Q到P.

上面描述的只是一个点。

同时P的近似函数:

把所有光线夹起来就是最终结果:

其中$J^{(n)}$ 表示各个方向每个点想实现方向散射的强度。

Precompute Solutions

后面的部分用处不大,以后再研究。