为什么有光线追踪?
因为光栅化不能将全局效果处理的很好,比如
不过光栅化很快,但是质量很低
光线追踪效果好,但是很慢。光栅化一般用于实时应用,光追一般用于离线应用(电影之类的)
光线
- 光线沿直线传播
- 光线和光线之间不会发生碰撞,各传播各的
- 光线从光源中被发出来经过多次反射折射等,最后传入到eye中。也可以认为光路是可逆的,从eye发出感知光线可以原路返回到光源
光线追踪就是在模拟光线不断弹射的过程
将光线折射和反射出去所有地方用light进行计算一遍(算是否在shadow中),将所有点的着色的值加上
技术问题
Ray-Surface Intersection
(光线和物体表面的交点)
光线的定义:就是射线,一个点和一个方向。r(t)是光线上的任意一点
球的定义:
交点:即在光线上,又在球上,同时满足两个方程
所以
t是不知道的,t就是时间,我们不知道传播多久可以打到这个球
求光线和隐式表面的交点
求光线和显示表面的交点,比如三角形
可以转换为光线和平面求交,然后判断点是否在三角形内部。所以只需要考虑光线和平面如何求交。
定义平面:定义一个点和一条法线就可以 定义一个平面
光线和三角形面组成的物体如何求交
光线和每个三角形都做一次求交,然后找出t最小也就是最近的交点,但是这样很慢!!
如何加速?
Bounding Volumes(包围盒),如何一个光线连包围盒都碰不到,就更不用去碰物体了
Bounding Box(AABB,轴对齐包围盒)
可以把一个长方体看成三组对立的面形成的交集
如何判断光线怎么和AABB求交?
计算出进入三个对面的时间和出三个对面的时间,三个对面都进入了才算进入立方体,出去一个就算离开了。所以进入立方体的时间是进入三个对面的最大时间,离开立方体的时间是离开三个对面的最小时间。判断和aabb是否光线相交,就是判断进入时间是否小于离开时间就行,如果小于证明光线一定有一段时间待在包围盒里
如果t是负数怎么办?如果texit是负数,证明没有交点。如果texit>=0,tenter<0,证明是在盒子内部发出的,一定有交点。
总结: