现代计算机图形学 作业5 解析(2)
上次我们说完了生成的光线,这次我们要正式进入光线追踪的过程中了
来到castRay
中,可以看到上面的注释,注释中写了对于几种材质的处理
对于我们这次框架来说,材质要么是反射和折射的,要么是反射,要么是漫反射的,我们对于每种情况分别处理
递归的过程中记录深度,如果深度超出了最大递归的深度,我们就不在累计贡献
然后首先默认将hitColor
设置成背景颜色
然后下面的if也是C++的一个新特性,可以在if语句中进行初始化,我在我最早的一篇文章中也有提过。
这里我们不进入到trace
的具体实现细节中去,这样可以让我们有一个更好的全局视野,但是我们需要搞清楚trace
是干什么的
跟踪到函数定义,可以看到最上面的函数描述,返回的是光线是否打到一个物体上,同时我们会获得对应的物体,三角形的索引,对应三角形的质心坐标以及光线方程中的t
然后我们可以通过t来计算光线与物体的交点,并且获得对应交点的一系列参数,比如我们交点处的st坐标,即对应的纹理坐标(uv坐标和st坐标是一样的)
向下看可以法线有三种情况,首先对于反射和折射的情况,我们分别通过入射方向和法线计算光线的方向,然后再根据光线方向与法线的方向为交点加上一个小的偏移,这样我们就可以得到出射光线的方向和出射点
得到光线后,我们递归调用castRay
来分别计算反射和折射对当前点造成的贡献,fresenl
就是菲涅尔项,用来解释反射光和入射光的强度
对于下面的只有反射的情况就比较简单了,我们只计算反射项既可
然后就是下面的漫反射的情况,在注释中有写到,我们用blin-phong模型来解决
这里有一个值得注意的一点,就是我们计算阴影,我们从击中点到光源发射一条光线,然后计算光线的距离和点到光源的距离来判断当前点是否在阴影中
然后用计算出来的系数乘上我们的纹理颜色,再加上高光项,但是这里貌似是有一个错误的,我个人感觉高光项需要加上阴影的影响,目前还不确定为什么高光没有加,可能影响比较小?
之后就可以来到trace
中看一下了,逻辑还是比较明显的,就是迭代每个物体来求交点,然后看object
的intersect
,就是迭代每个三角形求交点,然后就可以到需要我们实现的rayTriangleIntersect
了
这里直接翻译ppt上的公式,然后判断一下最后光线的t需要是正的,同时质心坐标为正即可
最后上一张图
文章评论