以往的Blinn-Phong光照模型在渲染场景时,对于光的漫反射和镜面反射都只会计算一次,但是实际上在一个场景里面,光有可能既存在反射也存在折射,而且,反射次数和折射次数并不只是一次
因此,Blinn-Phong在精确计算光照强度的时候是不太准确的,而光线追踪渲染方式,就是为了解决Blinn-Phong光照模型存在的问题
在光线追踪渲染模型中,光是沿着直线传播,光线和光线之间不会产生碰撞,所有的光路都是可逆的
首先从人眼或者相机发出光线,穿过每个像素,打到物体上,并判断光线与物体的交点,该过程如下图所示
如果一条光线可以穿过多个物体,只记录第一个被照射到的物体,后面的物体就被遮挡上了,就形成了阴影,如上图虚线所示
接着利用Blinn-Phong光照模型计算每条光线的照射点的亮度,将所有光线都计算一遍,就能得到所有像素的亮度
然而,这样做得到的结果与Blinn-Phong光照模型得到的结果一样,所以,要在此基础上添加一些额外的东西
添加的东西就是光线的反射和折射(反射和折射不是无限次的,需要指定反射或者折射的最大次数。),当光线打到光滑的物体表面时,会同时发生折射和反射
根据之前的三个设定中的光路的可逆性可知,此时,眼睛与球的交点的光照亮度不仅仅是由Blinn-Phong光照模型定义的,还包括了三角形和四边形的局部关照所产生的光照以及四边形的折射点所产生的的光照
然后,将上述四个点分别与光源连接。计算这四个点的局部光照强度,然后,将其他三个点的光照亮度加权累加(因为要考虑光线反射或者折射时的能量损失,所以要加权累加),最后与眼睛与球的交点的光照亮度进行求和,得到的就是最终该像素点的颜色
四、如何计算光线和物体表面的交点
知道了whited-style光线追踪的过程,那么,该如何计算光线和物体表面的交点呢?
上述过程判断点是否在三角形内较为麻烦,所以又有了直接计算出三角形与光线交点的算法了
交点可以通过光线来表示,也可以通过重心坐标来表示,将上式整理可得
参考
GAMES101-现代计算机图形学入门-闫令琪_哔哩哔哩_bilibili
Möller-Trumbore算法-射线三角形相交算法_zhanxi1992的专栏-CSDN博客
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出