镜面反射和透射
• 由光源直接照射引起的反射光亮度Ic • 沿V的镜面反射方向r来的环境光Ir通过投射在光
滑表面上产生的镜面反射光 • 沿V的规则透射方向t来的环境光It通过透射在透
明体表面上产生的规则透射光
7
光线跟踪算法的基本原理
▪ 光线跟踪算法用于求解Whitted整体光照明 模型
• Whitted整体光照明模型: I = Ic + krIr + ktIt 直接反射光+镜面反射光+规则透射光
光线跟踪算法
▪ 光线跟踪算法
• 基本原理 • 反射方向和折射方向的计算 • 光线与物体的求交 • 光线跟踪算法的伪语言描述 • 加速技术
1
光线跟踪算法的例子
2
三种明暗模型得到得结果
Flat Shading
Gouraud Shading
Phong Shading
3
光线跟踪
▪ 光线跟踪是迄今为止生成真实感图形最为成 功的算法之一
• 求出光线与场景中物体的全部交点 • 对所有这些交点沿着光线的方向排序,得到离视
点最近的交点 • 最后依据局部光照明模型计算该交点处的颜色值,
并将计算出的颜色值赋给该象素 • 当处理完所有屏幕象素时,即得到一幅真实感图
形
6
Whitted光照明模型
▪ Whitted整体光照明模型(镜面反射和透射): 假设从某一观察方向V所观察到的物体表面 某点P的光亮度的贡献来源于三个方面:
12
13
光线跟踪算法的基本原理
▪ 光线跟踪算法的终止标准
• 光线与环境中的任何物体均不相交(最自然的出 口)
• 当前光线对象素颜色的贡献很小。这是由于衍生 出的二次光线在环境中经多次反射/折射时会存在 衰减。一般可由用户预先设定一个阈值作为衡量 光线对象素颜色贡献的标准
• 递归达到了一定的层次。这一最大层次一般由用 户设定
color = local_color+kr*reflected_color+kt*transmitted_color;
return; } // 光线跟踪子函数RayTrace( )结束
18
光线与物体的求交
▪ 假设光线R的起始点为P,方向为D(不妨假设 D为单位矢量),则光线的参数方程表示为: R(t)=P+tD (t0)
光线跟踪算法的基本原理
▪ 对衍生出的二级光线递归地执行STEP1 和 STEP2,以计算来自镜面反射方向和透射方 向上周围环境对点P颜色的贡献Ir和It
▪ 依据Whitted光照明模型即可计算出点P处的 颜色值,并将计算出的颜色值赋给该象素。
▪ 当所有屏幕象素都处理完毕时,即得到一幅 真实感图形。
11
光线跟踪算法的基本原理
▪ 光线跟踪过程是上述光线衍生和在环境景物 之间传递的过程
▪ 光线跟踪过程是对真实世界光照明过程的逆 过程的一种近似
• 光线跟踪过程实际上是逆向跟踪从光源发出的光 在物体之间的多次反射和折射后投射到物体表面, 最终进入人眼的过程
▪ 光线跟踪过程可用一棵二叉树来表示,称为 光线树
19
加速技术
▪ 光线跟踪算法涉及到光线与场景中物体之间 的大量求交运算:
• 分辨率:12801024 • 反射和折射:10次 • 光源数:3个 • 物体数目:300000个三角片 • 在没有任何加速算法的前提下,计算量为: 12801024103300000=1.181013
9
光线跟踪算法的基本原理
STEP2: 镜面反射光Ir和规则透射光It的计算
• 在最近的交点P处衍生出二级光线(Secondary Ray ) ▪ 如果点P所在的表面为镜面,沿着上述一级光 线的镜面反射方向衍生出一条光线 ▪ 如果点P所在的表面为透明面,沿着上述一级 光线的透射方向衍生出一条光线
10
▪ 光线跟踪算法之美在于它的极度简单性 ▪ 光线跟踪生成的图形比前面介绍的三种明暗
处理方法真实得多(镜面反射、透明、阴影)
4
光线跟踪算法的基本原理
光线跟踪技术的前身是光线投射
光线投射算法示意图 5
光线跟踪算法的基本原理
▪ 光线投射(Ray Casting)算法
• 对屏幕上每一象素,从视点出发向该象素发出一 条光线
▪ 光线跟踪算法是光线投射算法的扩展
• 镜面反射光 • 规则透射光
8
光线跟踪算法的基本原理
STEP1: 直接反射光IC的计算
• 针对屏幕上的每一象素,从视点出发向该象 素发出一条光线(称为一级光线,Primary Ray)
• 求出光线与场景中物体的所有交点中离视点 最近的交点P
• 依据局部光照明模型计算该交点处的颜色值 Ic
置color为黑色; return; }
17
光线跟踪算法的伪语言描述ห้องสมุดไป่ตู้
用局部光照明模型计算交点P处的颜色值存入local-color; if(交点P所在的表面为光滑镜面) {
计算反射光线Rr; RayTrace(Rr, kr*ratio, depth+1, reflected-color); } if(交点P所在的表面为透明表面) { 计算反射光线Rt; RayTrace(Rr, kt*ratio, depth+1, transmitted-color); } 依照Whitted模型整合出最终的颜色值,即:
} }
16
光线跟踪算法的伪语言描述
RayTrace(R, ratio, depth, color) //光线跟踪子函数 {
if(ratio < THRESHOLD) { 置color为黑色; return;
} if(depth > MAXDEPTH) {
置color为黑色; return; } 光线R与场景中的所有物体求交,并找出离光线R起始点 最近的交点P; if(交点不存在) {
14
光线跟踪中反射与折射方向的计算
▪ 反射方向的计算:几何光学中的反射定律 ▪ 折射方向的计算:Snell定律
15
光线跟踪算法的伪语言描述
main ( ) //主函数 {
for(需要计算颜色的每一象素pixel) { 确定通过视点V和象素pixel的光线R; depth = 0; // 递归深度 ratio= 1.0; //光线的衰减系数,1.0表示无衰减 // 说明:color是经计算后返回的颜色值 RayTrace(R, ratio, depth, color); 置当前象素pixel的颜色为color;