光线追踪和光栅化的区别
光栅化不能处理更全局的信息。比如软阴影、玻璃的反射以及以及经过多次反射的光线。
光线追踪将整个过程变换为从摄像机发出感知射线,到达物体之后,如果相同的点也能够被光源感知到,以此进行渲染。感觉光栅化这个过程是从光源出发,最后通过投影转到相机上。光线跟踪是眼睛出去一条光线同时光源也去判断这个像素的可见性,最终“感知射线”还能够进行多次判断。
Three ideas about light rays
- Light travels in straight lines (though this is wrong)
- Light rays do not “collide” with each other if they cross(though this is still wrong)
- Light rays travel from the light sources to the eye (but the physics is invariant under path reversal - reciprocity)
Whitted-style的光线追踪
递归的想法,点打到一个地方弹射出去,打到新的地方再计算,最终加到这一个像素上。
光线和Triangle的相交
光线追踪,追踪来讲的话,就有一个概念非常重要。就是光线和平面(三角面片)的相交问题。
光线和三角形的相交问题就转为了光线和三角形所在平面的交点是否在三角形内。
另外有个大佬提出使用三角形的那个公式去表达三角形平面,这样能更快的求解。
包围盒求交
因为对三角形面片计算的话,计算量太大了,要计算来自每一个像素的射线与各个三角面的相交情况。
一个射线不与包围盒碰撞的话,自然就不会与包围盒中的物体相交。
为了方便之后的计算,定义的包围盒是AABB(轴对齐包围盒)
对于每一对平面都可以计算tmax和tmin。最终texit是tmax里面最小的,tenter是tmin中最大的。
如果texit>tmax说明光线与包围盒相交。
但是注意t>0,t是射线。
如果texit<0.说明不相交。
如果tenter<0,texit>0说明光线起点在包围盒内。相交。
In summary, ray and AABB intersect iff,tenter < texit && texit >= 0
这里还有为什么选择AABB的原因,是为了便于计算。