光线跟踪算法
视点
E
视屏
T5
象素点
P5
光源 L
E
R1
O P1
1
S1 S4
S3
T1 R2 P2
O R5 T4
2
P4
R4
R3
T2
O3
P3
光强计算
光线V与物体表面交与点P时,光在点P对 光线V方向的贡献分为三部分
由光源产生的直接的光线照射光强,是交点 处的局部光强
反射方向上由其他物体引起的间接光照光强, 通过对反射光线的递归跟踪得到;
光源发出光线,经反射与折射,只有很 少部分可以进入人的眼睛
实际光线跟踪方向与光传播的方向相反
四种光线定义
在光线跟踪算法中,有如下的四种光线
视线是由视点与象素(x,y)发出的射线 阴影测试线是物体表面上点与光源的连线 反射光线,视线反射方向光线 折射光线,视线折射方向光线
光线跟踪算法
射
全局光照明模型
模拟复杂逼真的光照明现象 主要介绍光线跟踪算法
全局光照
光线跟踪 辐射度算法 渲染方程
光线跟踪的基本原理
光线在物体之间的传播方式- 由光源发出的光到达物体表面后,产生 反射和折射。
由光源发出的光称为直接光,物体对直 接光的反射或折射称为直接反射和直接 折射,相对的,把物体表面间对光的反 射和折射称为间接光,间接反射,间接 折射-光线跟踪算法基础
确定多边形所在平面方程 求光-平面相交的交点 检查交点是否在多边形内
光线-多边形相交
确定多边形所在平面方程
求光-平面相交的交点
检查交点是否在多边形内
多边形内 i 2 多边形外 i 0
α2
α3
α1
α4 α5
弧长法
B
C
D
a2
a3
a1
A
a4 E
A
a2
a3 D
P a4
简单,但严重增加了计算量。
光线所有跟踪算法最耗时的计算就是光线和 场景的求交运算。
改进—阴影(2)
考虑了阴影的一张效果如下
改进—阴影(3)
为了加快阴影计算,产生了一些办法
Lightbuffer ShadowMap …… 主要思想是预先计算出阴影的位置存起来。计算时
查表。
阴影的边缘很明显,真实的是软阴影(soft shadow,还记得电影里的镜头么?)
《计算机图形学基础》
第十讲 光线跟踪与加速技术 刘永进
作业 C类 B类 A类
提交时间 11月15日 11月29日 12月13日
简单光照明模型
局部光照明模型
物理学 整体光照明模型
计算机科学
现代光学
计算机图形学
光的波动特性 光的干涉特性
真实感、准确性
光照模型
光的衍射特性 光的偏振特性
快速、实时性
OpenGL光照模型
软阴影实际上是由光源模型决定的,经典光线跟踪 假定光源为点光源,而现实中都是面光源。所以软 阴影在经典光线跟踪中是无法实现的。
光线跟踪加速技术
回顾光线跟踪基本算法
回顾光线跟踪基本算法
TraceRay( Start, Direction, Depth, Color) { if (Depth>MAXDEPTH) Color=Black; else { 求光线(Start, Direction)与场景的最近交点P if (没有交点) Color=Black else { 用局部光照模型计算LocalColor,输入为相交物体O和交点P。 if (物体在P点是镜面) TraceRay(P, 反射方向, R_Color); if (物体在P点是透射面) TraceRay(P, 折射方向, T_Color); Color = LocalColor + ks * R_Color + kt * T_Color; } }
Beam Tracing, Cone tracing, Pencil tracing
包围盒(Bounding Box/Volume)
把复杂的几何体用一个简单的包围盒包起 来
if ( 没有交点 ) color = black;
else {
Ilocal = 在交点处用局部光照模型计算出的光强; 计算反射方向 R;
RayTracing(最近的交点,R, weight*Ws,Is); 计算折射方向 T;
RayTracing(最近的交点,T,weight*Wt,It);
color = Ilocal + KsIs + KtIt ;
光线—三角形相交(2)
s1=b1, s2=b2, s3=1 b1 b2
O + tD = b1P1+b2P2+ (1 b1 b2)P3
E1=P1 P3, E2=P2 P3, T=O P3
解方程组
t
D
E1
E2
b1
T
检查
b2
0≤b1≤1 0≤b2≤1
光线-多边形相交
视点
E
视屏
T5
象素点
P5
光源 L
E
R1
O P1
1
S1 S4
S3
T1 R2 P2
O R5 T4
2
P4
R4
R3
T2
O3
P3
RayTracing(start, direction, weight, color) {
if ( weight > MaxWeight ) color = black;
else { 计算光线与所有物体的交点中离start最近的点;
/2
(+ +) (- - )
(+ +) (+ - )
-/2
……
…
象限变化 I I I II I III
I IV
P2(+,-) P
...
P3(-,-)
P1(+,+)
P5(+,-) P4(+,-)
光-球面相交
P = O + tD (P – C)2 – R2 = 0
(O+tD–C)2–R2=0 at2 + bt + c=0
其他不同的假设会产生不同的计算过程。 但都会跟踪光线的传播,都会涉及光线物 体求交等运算,所以有时候统称为光线 跟踪算法。
经典的光线跟踪
经典光线跟踪(Raytracing, Whitted 1979) 算法假设
物体表面完全光滑,光在物体表面只会产生 理想漫反射、镜面反射、规则透射,或者是 三种的线性组合。
a=D2 b=2(O – C) ·D c=(O – C)2 – R2
D
O
C
P
b b2 4ac t
2a
光—隐式曲面相交
曲面方程减去光线方程 求正的实数根
牛顿法 区间法 启发式方法 ……
光线跟踪算法
光线跟踪是对光物理性质的数学建模 公认的光学性质
光沿直线传播 光线相交,不会互相影响 光传播有可逆性
算法规定:若顶点pi的某个坐标为0,则其符 号为+。若顶点pi的x、y坐标都为0,则说 明这个顶点为被测点,我们在这之前予以排 除。于是弧长变化如下表。
表 :符号对变化与弧长变化的关系
(sxi , syi) (sxi+! , syI+1) 弧长变化
(+ +) (+ + )
0
(+ +) (- + )
光线跟踪算法
视点
E
视屏
T5
象素点
P5
光源 L
E
R1
O P1
1
S1 S4
S3
T1 R2 P2
O R5 T4
2
P4
R4
R3
T2
O3
P3
视线跟踪-由视点与象素(x,y)发出一根
射线,与第一个物体相交后,在其反射 与折射方向上进行跟踪
A
V
(x,y)
B
最基本的光线跟踪算法是跟踪镜面反射 和折射。 从光源发出的光遇到物体的表面,发生 反射和折射,光就改变方向,沿着反射 方向和折射方向继续前进,直到遇到新 的物体
RayTracing(最近的交点,R, weight*Ws,Is); 计算折射方向 T;
RayTracing(最近的交点,T,weight*Wt,It); color = Ilocal + KsIs + KtIt ; }
光线跟踪算法实际上是光照明物理过程 的近似逆过程
光线跟踪基本过程可以跟踪物体间的镜 面反射光线和规则透射,模拟了理想表 面的光的传播
}
这是一个递归的过程,结束条件是:光到达理想散射面或者递归层数到达预先设定值 ks: 镜面反射系数,kt 透射系数
经典光线跟踪的改进—阴影
阴影是真实感图形的一个重要组成部分
上述的光线跟踪算法加入阴影的考虑很简 单:在计算局部光照的时候,先判断P点 沿光源L方向会否被场景中的不透明物体 挡住,如果挡住则跳过此光源。
}
} }
视点
E
视屏
T5
象素点
P5
光源 L
E
R1
O P1
1
S1 S4
S3
T1 R2 P2
O R5 T4
2
P4
R4
R3
T2
O3
P3
光线与物体求交
对于反射光线与折射光线的方向计算问 题 -Whitted光透射模型中的计算方法
光线跟踪算法中需要用到大量的求交运 算,因而求交运算的效率对于整个算法 的效率影响很大
根据假设,计算方法自然得到
经典的光线跟踪(2)
TraceRay( Start, Direction, Depth, Color) { if (Depth>MAXDEPTH) Color=Black; else { 求光线(Start, Direction)与场景的最近交点P if (没有交点) Color=Black else { 用局部光照模型计算LocalColor,输入为相交物体O和交点P。 if (物体在P点是镜面) TraceRay(P, 反射方向, R_Color); if (物体在P点是透射面) TraceRay(P, 折射方向, T_Color); Color = LocalColor + ks * R_Color + kt * T_Color; } }