More than code

More Than Code
The efficiency of your iteration of reading, practicing and thinking decides your understanding of the world.
  1. 首页
  2. 计算机图形学
  3. 正文

现代计算机图形学 作业7 解析

2021年8月14日 498点热度 0人点赞 0条评论

现代计算机图形学 作业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那这篇文章就先到这里。

标签: 图形学
最后更新:2021年8月17日

sheep

think again

点赞
< 上一篇
下一篇 >

文章评论

取消回复

COPYRIGHT © 2021 heavensheep.xyz. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS