现代计算机图形学 作业7 解析
吐个槽,现在又进入了很迷的状态,基本上一天都在忙,但是也都不知道在忙什么,也没有花出很大的时间去读书或者写文章,要找时间去调整一下
这篇文章解析一下实现path tracing的最基本的内容,下篇文章将会讲解多线程和微表面模型相关的实现
此外这篇文章就不会再去深入解读之前已经讲过的东西了,我们把重心放在path tracing
看到Render
,我们会对每一个像素进行采样,发出若干条光线,并最后把这些光线得到的结果平均起来。课上老师有提过,我们最后得到的光线其实并不能直接的转化成颜色,而是要通过伽马校正来得到真实的颜色,我猜测(注意是猜测),在代码中,应该体现到的就是最后生成图片的时候,我们会对每一个像素的值进行clamp
,然后再取0.6次方。但是很具体的原理我这里还不是很清楚。
然后我们来到castRay
中,这里就是我们要实现path tracing的地方。这里我的实现是按照ppt中给的伪代码来的,也就是我具体的实现在自己定义的一个函数shade
中,大家如果有兴趣可以来我的github看
首先我们投射光线到场景中,判断求交,没交点就直接返回背景色就行
有交点的话我们就要进行shade了,首先判断这个交点是光源么,如果是光源就要直接返回光源对应的光就行。
不是光源的话,我们就要进行直接光照的计算,首先对光源采样,然后取到对应采样点的信息和对应的pdf。然后我们从交点向采样点打一条光线过去,判断中间是否有障碍物。然后注意记得蒙特卡洛积分的规则,对谁采样就要对谁积分,我们对光源采样,就要对光源积分。但是我们实际上需要的是对交点的半球积分,所以我们要把光源的面积转化成对应半球上的立体角。这个在ppt中有我就不多说了。
然后根据渲染方程写出代码,记得要调整入射光线的方向,最好两个方向都和法线方向都是同向的,这样在后面实现微表面模型比较方便。
然后就是间接光照。首先我们要进行俄罗斯轮盘赌,判断这个光线是否还能继续递归下去。
然后根据我们投射的方向,在这个交点上采样另一个方向的光线。这里采样的概率就和我们的材质有关了,比如是个镜子,那么肯定就是反射要多。但是代码中只给了漫反射的材质,之后我们会说其他材质的实现。
然后就是判断新的光线是否有打到物体,同时还不能是光源,因为对于这个点,光源的贡献已经上面的直接光照中计算过了。同样的根据渲染方程写代码即可,这里就会涉及到递归调用shade函数。同时别忘了最后除以俄罗斯轮盘赌的概率,以保证我们的期望是正确的。
最后返回对应两种光照的累加和就行。还有几点要说的就是有关eval
和sample
以及pdf
,这个是材质相关的三个函数,其实也是path tracing中很关键的三个函数,因为外面的shade实现好了以后基本上就不用动了,后面调整我们的模型都是根据这三个函数来实现的。
sample就是采样一个光线,这里就是在一个半球上均匀的采样一条光线,然后对应的pdf就是采样这个光线对应的概率,因为我们是均匀的采样,所以概率就是\frac{1}{2\pi}
eval就是这个反射的BRDF,代码中的漫反射对应的BRDF就是一个常数,这个常数就是之前漫反射模型中的那个,但是这里多除了个\pi,有关这个\pi我目前了解的也不是很多,据说是因为渲染方程放缩了光线。
ok那这篇文章就先到这里。
文章评论