Ray Tracing

Ray Tracing

光 线 跟 踪  Ray Tracing


简介:
在计算机图形学领域,这技术被普遍应用于生成高质量的照片级图像,在为一个场景计算光照的时候,通过固定管线就可以计算phong光照模型,由于该模型的特征,使得渲染的物体看起来有塑料得感觉,如果要渲染一个有金属质感的且能反射出周围环境的物体,phong模型就无能为力了。和固定渲染管线相比,可编程图形渲染管线的能力要强得多,虽然固定管线里面可以用环境贴图来实现物体对环境的反射效果,但这种环境只能反射出已经保存在cube map的中贴图,在真实世界中,如果能反射出周围环境的物体还有很多其他物体,他们就会互相反射,一般环境贴图技术大达不到这种效果,这就要用到光线追踪技术。

光线跟踪是一种多功能技术,它可以用同一模型来模拟光源和环境入射光在物体表面产生的镜面反射和折射、实现场景的消隐及生成阴影等,同时,也可以用作体绘制(volue rendering)的基础.

光线跟踪算法由于需要跟踪每一条从视点出发的光线,因而涉及到大量的光线与景物的求交计算,与传统的扫描线算法相比,光线跟踪算法所需的计算量显得很庞大,所以必须提高光线与景物的求交测试效率,器途径有两个:一个是提高光线与景物的求交计算效率,例如光线跟踪参数去面片、光线跟踪代数去面片、光线跟踪分维曲面等,这些算法针对具体曲面特点改善了求交的数学方法,减少了求交的计算量;另一个途径是快速确定光线与景物是否有交,这一方法已成为加速光线跟踪的主流技术,主要有:包围盒算法和空间剖分算法.

基本算法:
在光线跟踪系统中,物体空间中一点被取作试点,一个与视点位置适当的平面矩形区域被取作投影屏幕,为了简化计算,常把视点取在Z轴上,并取xoy平面作为投影屏幕,投影屏幕用两组相互垂直的平行线分成若干个小方格,每个小方格对应于屏幕的一个像素,常取小方格中心为取样点
图形生成时通过对每个像素分别计算颜色亮度来进行的。首先,从视点出发,引出一条视线穿过取样点,像物体空间延伸,通过计算求得与它相交的物体。视线可能与多个物体相交,存在多个交点。可以通过比较各个点与视点的距离,求得离视点的最近点。改点称为在视点方向上相对于视点的可见点。可见点除的法向量必须计算出来,以满足后面的计算需求。法向量计算出来以后,通过查找表面数据表,获得表面的颜色属性,反射率,透明性与粗超程度等,就可以可以使用光照模型公式来计算可见点的发射强度。然后在此计算之前,首先要判断可见点是否处于阴影中。判断的方法是从改点想光源引射线,看射线是否与某不透明的物体相交。
        如果物体比较光滑,反射性比较强,那么其他物体可以通过可见点反射或者折射到达视点,对于这类表面,我们在求得可见以后,必须沿反射线方向继续跟踪,看看在反射线或者折射线方向上是否有物体存在,,这种射线称为间接事先,当间接视线与物体相交时,确定离可视点最近的交点,称为间接可视点,它对可见点的光强度可以计算出来,在间接可见点可能又需要从反射或者折射方向跟踪视线。在这个过程中实际上是一个递归过程。所以光线跟踪本质上是一个递归算法,每个像素的颜色与光强必须综合各级递归计算的结果才能获得
R
aytracing(start_point,view_direction,wright,color){
/* start_point:在第一次调用表示视点,以后各级递归用于表示可见点
  view_direction;视线方向,与光传播方向相反
  weight: 当前点光强计算结果的贡献比例值,当它小于阀值Minweight时,将被认为对最终计算结果影响很小,可忽略不计
  color;返回值
*/
  
if (wight < Minweight)
     color
= blank;
  
else {
      
if (无交点)
         color
= blank;
      
else {
       Io
= 交点出光照模型值;
       计算反射方向R
       Raytracing(交点,R,weight 
*     Wr,Ir);
       计算折射方向T;
       Raytracing(交点,T,weight 
* Wr,It);
       color
= Io + Ir + It;
      }
 }
 }


虽然在理想情况下,光线可以在物体之间进行无线的反射与折射,但是实际的算法进行过程中,我们不可能进行无穷的光线跟踪,给出几种终止条件:
1>该光线未碰到任何物体
2>该光光线碰到了背景
3>光线在经过许多次反射和折射以后,就会产生衰减,光线对于视点的光强的贡献值很小(小于某个设定值)
4>光线反射与折射次数即跟踪深度大于一定值

光线与物体求交:

你可能感兴趣的:(Ray Tracing)