光线追踪(Whitted-Style)
光栅化在软阴影和光线多次弹射上的实现比较麻烦,所以引入了光线追踪的方法。光栅化通过Shadow Mapping来实现阴影的效果,它应用于点光源上。
光栅化是光线从相机沿着每个像素的方向打到场景上,然后弹射到光源,即只有一次的光线弹射。
光栅化的质量会比较低,但也有着它的好处,就是非常快。光线追踪根据实际物理规律来模仿的,会非常逼真,但是会非常慢
光栅化可用于实时渲染,光线追踪一般用于线下渲染
光线追踪:光线从摄像机穿过屏幕上像素,向场景内发射,光线有可能打到物体,也有可能打不到物体上,如果打到物体上,就向光源连去,如果能到达光源说明不在阴影里,如果无法到达,就是在阴影里。
它也是记录光线打到最近的物体上
然后向光源连线,有了入射方向和出射方向和法向量,就可以计算这点的着色,然后写回到像素内
(Whitted-Style) Ray Tracing:当光线打到某个光滑物体的表面,会发生反射,或者打到玻璃材质时会发生折射,考虑折射和反射光线打到的物体表面,
分别都对光源连线,计算所有点的着色,都加到同一个像素内。也要考虑光线能量的损失,不能无限反射。
先是定义光线,光线有一个起点,和一个方向,以及时间t。
光线与场景中的物体会发生交互,所以需要判断光线与物体上三角形的交点是否在三角形内。先需要判断交点是否在三角形所在平面内,然后判断交点是否在
三角形内。
定义平面:过平面的法向量,和平面上的点p'确定一个平面,某个点p和p'的连线与法向量垂直,说明p点在该平面内。
计算光线与平面的交点,然后判断交点是否在三角形内。
也有算法可以直接算出交点是否在三角形内,用重心坐标来计算,要保证t>0,才有实际意义,当1-b1-b2,b1,b2非负说明交点在三角形内。
考虑光线与场景中所有的三角形求交,这样会非常非常慢,需要方法来加速这个过程,可以给一个物体加一个包围盒,这个包围盒会把物体完整的包围住,