渲染前沿技术浅谈
双向路径追踪(BDPT)
之前我们的路径追踪算法是从相机产生的一条路径,连接路径和光源。
双向路径追踪可以理解为从相机产生一条半路径,从光源也产生一条半路经,然后将两条半路经连接起来。
如图,左图存在着一个现象是场景中的光照呈现处凹凸的颗粒感的感觉,这是因为在这个场景中,大部分都是间接光照,我们使用之前的那套路径追踪方法,从相机出发打出一条光线经过墙壁等的漫反射后会弹射到其他各个方向,比如弹射到另外一处阴影处,此时该点接收到的能量就弱,而相邻的一点存在一定概率打在能量集中的光源附近,此处的能量就很大,所以就会出现这样一种颗粒的感觉。
而在这种光源方向的路径比较好计算的情况下,我们使用BDRT方法,也就是引出一条从光源的光线,再从相机引出一条光线路径,再连接两条路径,最后得到的光线路径更合理。
Metropolis光线传输(MLT)
MLT的思想是用统计学上一个采样的工具 —— 马尔科夫链。
马尔可夫链可以根据当前的一个样本,生成一个跟它靠近的下一个样本。这样我们就可以根据不断生成的新样本来估计这个函数的值。
之前我们在谈蒙特卡洛积分的时候,说到对于某一个区域进行采集时,我们要按照某个PDF进行采样,而只有当采样的PDF和这个被积函数形状一致的时候,得到的差异是最小的。
那么,马尔可夫链的用处就来了。任何一个未知函数,我们都可以通过马尔科夫链,生成一系列的样本,使得这些样本的分布就是和被积函数的形状一致。
例如,以路径作为样本时,可以不断产生新的一段路径,最后生成一整条曲折的线。
在复杂的光线传播下,使用MLT会有更好的效果。
但是缺点也很明显:
一个是不能估计何时收敛,二是每一个像素收敛的速度不同,场景上会很脏。
光子映射
caustics:由于光线的聚焦产生的比较强的图案。
光子映射的实验方法:
首先,从光源出发,打在一个物体上并向四周弹射,直到它们落在漫反射表面上,记录下来。
然后,从相机出发发射光线,也是向四周弹射,直到他们落在漫反射表面上。
最后,我们可以做一个局部密度估计。
也就是在这个漫反射表面中一个着色点周围计算N个光子覆盖的面积,然年用光子数量N来除以面积即可得到密度,我们可以说密度更大的着色点更亮。
但是这样存在一个问题就是我们在计算密度时,应该用数目于面积求微分,而我们这里如果总光子比较稀时,选取的是一块大区域。
为了得到一个更准确的结果,我们可以在原来的面积上增加光子数目,这样,我们一定光子数目对应的面积就会无限小,趋近于微分了。
这时我们就得到了一个有偏但一致的结果。
VCM
在连接点两边的路径使用BDPT,如果连接点不能连起来但很靠近的时候我们用光子映射。
实时辐射度算法
简单说,就是把一个大的光源发出的光看成是这个光源照射到场景上,然后把这些场景上的点看成是光源(VPL),再使用VPL对场景进行渲染。
前沿外观建模技术
非表面模型
散射介质
对于云,雾等物体,打在这个物体时,光线会穿透其中,在内部进行散射或者被吸收。
对于光线在这个物体上该如何散射,我们定义一个相位函数,表述光线在各个方向上散射的情况。
这里我们可以得到在一个体积内的路线变化情况。
头发材质
这里定义了一个头发模型。
太复杂了,还是剪掉ba。。。
颗粒材质
例如沙子等材质
表面材质
次表面材质
例如玉石,水母等
光线在进入物体时会在内部经过反射再出来,这种我们称为次表面散射。
此表面散射可以理解为对BRDF的一个延伸。
BRDF是定在一个点上,而我们定义在此表面方向上多了一个S(xi,wi,xo,wo),表示这个光线从哪一个点沿着什么方向进来,又沿着哪个点什么方向出去。
所以,此表面散射我们稍微修改一个原本的BRDF即可。
所以,我们可以在物体内“藏”一个光源,可以得到一个此表面散射的近似效果。
如图:
布料材质
首先,我们可以把它当成是一种表面模型,也就是BRDF。
对于这种材质,我们可以把它当成是一个散射介质,对它内部进行渲染。
当然,我们也可以把它当成是纤维,一根根渲染。
程序化材质
比如说定义三维空间中的噪声函数。
木纹啥的。