光线追踪(Whitted-Style)

光栅化在软阴影和光线多次弹射上的实现比较麻烦,所以引入了光线追踪的方法。光栅化通过Shadow Mapping来实现阴影的效果,它应用于点光源上。

光栅化是光线从相机沿着每个像素的方向打到场景上,然后弹射到光源,即只有一次的光线弹射。

 

 

光栅化的质量会比较低,但也有着它的好处,就是非常快。光线追踪根据实际物理规律来模仿的,会非常逼真,但是会非常慢

 

光栅化可用于实时渲染,光线追踪一般用于线下渲染

 

 光线追踪:光线从摄像机穿过屏幕上像素,向场景内发射,光线有可能打到物体,也有可能打不到物体上,如果打到物体上,就向光源连去,如果能到达光源说明不在阴影里,如果无法到达,就是在阴影里。

 

 

它也是记录光线打到最近的物体上

 

 

 

然后向光源连线,有了入射方向和出射方向和法向量,就可以计算这点的着色,然后写回到像素内

 

 

 

(Whitted-Style) Ray Tracing:当光线打到某个光滑物体的表面,会发生反射,或者打到玻璃材质时会发生折射,考虑折射和反射光线打到的物体表面,

分别都对光源连线,计算所有点的着色,都加到同一个像素内。也要考虑光线能量的损失,不能无限反射。

 

 

 

先是定义光线,光线有一个起点,和一个方向,以及时间t。

 

 

 

光线与场景中的物体会发生交互,所以需要判断光线与物体上三角形的交点是否在三角形内。先需要判断交点是否在三角形所在平面内,然后判断交点是否在

三角形内。

 

定义平面:过平面的法向量,和平面上的点p'确定一个平面,某个点p和p'的连线与法向量垂直,说明p点在该平面内。

 

 

 

计算光线与平面的交点,然后判断交点是否在三角形内。

 

 

 

也有算法可以直接算出交点是否在三角形内,用重心坐标来计算,要保证t>0,才有实际意义,当1-b1-b2,b1,b2非负说明交点在三角形内。

 

 

 

考虑光线与场景中所有的三角形求交,这样会非常非常慢,需要方法来加速这个过程,可以给一个物体加一个包围盒,这个包围盒会把物体完整的包围住,

 

如果光线都没有和包围盒交互,那么肯定不会和包围盒内的场景有交互。

 

 

 

包围盒是由三对平行的平面相交,产生的一个box

 

 

先考虑在二维平面下,然后在三维场景下。求出光线进入和离开每一对平面的时间

 

 

 

在求出三对进入和离开的时间后,当光线进入box时,光线必须在三对平面内都进入,所以t必须要大于最大的进入时间才能保证光线进入box

当光线离开box时,光线只需要离开任意一对的平面就说明光线离开box了,所以t要大于最小的离开时间。

 

 

总结如下:进入时间必须要小于离开时间,且离开时间要大于等于0,才能保证光线与box有交点

 

 

包围盒的平面与轴平行是为了简化计算

posted @ 2022-08-17 15:41  捞的不谈  阅读(587)  评论(0编辑  收藏  举报