光照模型
光源
任何发出辐射能量的对象——发光体和反射体及其混合
属性:位置、颜色、方向、形状
分类
- 点光源:所有光向四周平均发射 适用于比对象小得多的光源或离场景不太近的大光源
- 无穷远出光源(近似平行光源):模拟类似太阳光线
辐射强度衰减
I
I
I 随
1
/
d
l
2
1/d_l^2
1/dl2衰减
问题:
- 接近光源是强度变化过大
- d l d_l dl 过大时,变化太小
改进: f r a d a t t e n ( d 1 ) = { 1.0 光 源 在 无 穷 远 处 1 a 0 + a 1 d l + a 2 d l 2 光 源 为 局 部 光 源 f_{radatten}(d_1)=\begin{cases} 1.0 \qquad 光源在无穷远处\\ \frac{1}{a_0+a_1d_l+a_2d_l^2}\quad 光源为局部光源 \end{cases} fradatten(d1)={1.0光源在无穷远处a0+a1dl+a2dl21光源为局部光源
方向和投射效果
光线方向向量
V
l
i
g
h
t
V_{light}
Vlight和方向范围
θ
l
\theta_l
θl构成一个圆锥体的可照射区域
记光源位置道一个对象位置的方向向量为
V
o
b
j
V_{obj}
Vobj
则判断其是否可被照射到:
α
=
a
r
c
c
o
s
(
V
o
b
j
⋅
V
l
i
g
h
t
)
<
θ
l
\alpha=arccos(V_{obj}\cdot V_{light})<\theta_l
α=arccos(Vobj⋅Vlight)<θl
沿着光源的方向向量光强最强,家督增加,强度衰减
f
a
n
g
a
t
t
e
n
(
α
)
=
c
o
s
a
l
α
,
其
中
,
α
l
为
衰
减
指
数
f_{angatten}(\alpha)=cos^{a_l}\alpha,\\ 其中,\alpha_l为衰减指数
fangatten(α)=cosalα,其中,αl为衰减指数
基本光照模型(反射)
漫反射
粗糙表面,将光向各个防线发散出去
理想漫反射体
入射光在各个方向以相同强度发散而与观察者位置无关
反射光强度可以根据朗伯余弦定理
强
度
=
单
位
时
间
辐
射
能
投
影
面
积
→
c
o
s
ϕ
N
d
A
c
o
s
ϕ
N
,
其
中
d
A
是
单
位
面
积
,
ϕ
N
是
表
面
法
向
量
与
辐
射
能
方
向
夹
角
强度=\frac{单位时间辐射能}{投影面积} \rightarrow \frac{cos\phi_N}{dAcos\phi_N},\\ 其中dA是单位面积,\phi_N是表面法向量与辐射能方向夹角
强度=投影面积单位时间辐射能→dAcosϕNcosϕN,其中dA是单位面积,ϕN是表面法向量与辐射能方向夹角
假设每一表面都按照理想漫反射体对待,则可以将模型简化为
I
d
=
I
∗
k
d
I_d=I*k_d
Id=I∗kd,
k
d
k_d
kd是漫反射系数
- 环境光漫反射
记环境光为 I a I_a Ia,则环境光对漫反射的贡献可表示为: I a m b d i f f = k a I a I_ambdiff=k_aI_a Iambdiff=kaIa,但是只有环境光缺乏立体感 - 光源漫反射
记光源强度为 I l I_l Il,入射光与反射平面的夹角为 θ \theta θ则漫反射光强度为 I l , d i f f = k d I l c o s θ I_{l,diff}=k_dI_lcos\theta Il,diff=kdIlcosθ
上述两者综合可得漫反射公式如下:
I d i f f = { k a I a + k d I l ( N ⋅ L ) N ⋅ L > 0 k a I a e l s e 其 中 L 为 反 射 光 线 单 位 向 量 , N 为 反 射 表 面 单 位 法 向 量 I_{diff}=\begin{cases}k_aI_a+k_dIl(N\cdot L)\qquad N \cdot L >0 \\ k_aI_a \qquad else \end{cases} 其中L为反射光线单位向量,N为反射表面单位法向量 Idiff={kaIa+kdIl(N⋅L)N⋅L>0kaIaelse其中L为反射光线单位向量,N为反射表面单位法向量
镜面反射
光滑表面上的高光, 是由接近镜面反射角的一个汇聚区域内,入射光的全部或绝大部分成为反射光所导致的
非理想反射体
反射方向分布在向量R周围的有限范围内
- 较光滑表面的镜面反射范围较小
- 粗糙的对象表面有较大的反射范围
Phong镜面反射模型
镜面反射光强度与
c
o
s
n
s
ϕ
cos^{n_s}\phi
cosnsϕ成正比,即
I
l
,
s
p
e
c
∝
I
l
c
o
s
n
s
ϕ
I_{l,spec} \propto I_lcos^{n_s}\phi
Il,spec∝Ilcosnsϕ
其中
n
s
n_s
ns为镜面反射参数
I
l
,
s
p
e
c
=
{
k
s
I
l
(
V
⋅
R
)
n
s
V
⋅
R
>
0
和
N
⋅
L
>
0
0
e
l
s
e
其
中
,
V
为
视
点
方
向
,
R
为
反
射
R
=
(
2
N
⋅
L
)
N
−
L
I_{l,spec}=\begin{cases} k_sI_l(V \cdot R)^{n_s} \quad V \cdot R>0和N \cdot L>0\\ 0 \quad else \end{cases}\\ 其中,V为视点方向,R为反射 R=(2N\cdot L)N -L
Il,spec={ksIl(V⋅R)nsV⋅R>0和N⋅L>00else其中,V为视点方向,R为反射R=(2N⋅L)N−L
简化:
- L与V之间的半角向量H来计算镜面反射范围: H = L + V ∣ L + V ∣ H=\frac{L+V}{|L+V|} H=∣L+V∣L+V
- 用 c o s α cos\alpha cosα代替 c o s ϕ cos\phi cosϕ
- 用 N ⋅ H N \cdot H N⋅H代替 V ⋅ R V \cdot R V⋅R
漫反射和镜面反射合并:
I
=
I
a
m
b
d
i
f
f
+
∑
l
=
1
n
(
I
l
,
d
i
f
f
+
I
l
,
s
p
e
c
)
=
k
a
I
a
+
∑
l
=
1
n
I
l
[
k
d
(
N
⋅
L
)
+
k
s
(
N
⋅
H
)
n
s
]
I=I_{ambdiff}+\sum^n_{l=1}(I_{l,diff}+I_{l,spec})=k_aI_a+\sum^n_{l=1}I_l[k_d(N \cdot L)+k_s(N \cdot H)^{n_s}]
I=Iambdiff+l=1∑n(Il,diff+Il,spec)=kaIa+l=1∑nIl[kd(N⋅L)+ks(N⋅H)ns]
透射模型
透明对象表面同时产生反射光和折射光
反射光
- 根据Snell公式计算折射角 θ r \theta_r θr: s i n θ r = η i e t a r s i n θ i sin\theta_r=\frac{\eta_i}{eta_r}sin\theta_i sinθr=etarηisinθi
- 折射方向向量T: T = ( η i η r c o s θ i − c o s θ r ) N − η i η r L T=(\frac{\eta_i}{\eta_r}cos\theta_i-cos\theta_r)N-\frac{\eta_i}{\eta_r}L T=(ηrηicosθi−cosθr)N−ηrηiL
折射光
假设:
- 不考虑折射导致的路径平移
- 各对象间的折射率不变
- 折射角=入射角
简化光强: I = k t I t r a n s I=k_tI_{trans} I=ktItrans,其中 k t k_t kt为该点的透射系数
总光强: I = ( 1 − k t ) I r e f l + k t I t r a n s I=(1-k_t)I_{refl}+k_tI_{trans} I=(1−kt)Irefl+ktItrans
全局光照
光线跟踪算法
跟踪光线在场景中的反射和折射,并计算对光强的作用
优点:真实
缺点:计算量大
是一种高度视相关的方法,
基本算法
- 为光线跟踪算法建立一个投影参考点在z轴、投影平面为xy平面的坐标系统
- 从投影参考点出发,穿过每个像素中心进入场景
- 计算与该光线相交的所有表面,找到最近的交点(可见面)
- 计算该光线在此交点上反射和折射光强度
- 构造光线跟踪树
构造的停止条件:
- 该光线不和任意表面相交
- 该光线与一个光源相交且该光源不是一个反射面
- 该树达到最大允许深度(常用)
光线与对象表面计算求交
- 光线由初始位置 P 0 P_0 P0和单位向量 u u u描述 P = P 0 + s u P=P_0+su P=P0+su, s s s为 P 0 P_0 P0到光线与 P P P点的距离
- 由球面方程 ∣ P − P c ∣ 2 − r 2 = 0 |P-P_c|^2-r^2=0 ∣P−Pc∣2−r2=0联立可得 s = u ⋅ Δ P ± ( u ⋅ Δ P ) 2 − ∣ Δ P ∣ 2 + r 2 s=u \cdot \Delta P \pm\sqrt{(u \cdot \Delta P)^2-|\Delta P|^2+r^2} s=u⋅ΔP±(u⋅ΔP)2−∣ΔP∣2+r2
减少对象求交计算量的方法
- 包围盒
- 空间分割法
- 将整个场景包含在一个立方体中
- 将立方体逐次分割直至每个子立方体所包含的对象表面或表面数目小于等于一个预定的最大值
- 跟踪穿过立方体的光线,仅需对包含表面的单元执行求交测试。光线所交的第一个对象表面记为可见面
- 该过程继续直到找到一个相交的对象表面或光线射出包围场景的立方体
纹理与表面细节
纹理映射
2D映射、3D映射
方法:
- 建立像空间和纹理空间映射关系
- 纹理坐标0到1.0
二维映射
不同的Map Shape产生不同的效果,从纹理表中查找对应的颜色
- 平面
- 圆柱体
- 球体
- 盒子
三维映射
利用对象每个点 ( x , y , z ) (x,y,z) (x,y,z)直接计算纹理颜色,不使用map shape
噪声
凹凸映射
纹理映射无法模拟粗糙表面物体
使用扰动函数并在光照模型中计算使用扰动法向量
- 令 P ( u , v ) P(u,v) P(u,v)表示一个参数曲面上的点, N = P u × P v N=P_u \times P_v N=Pu×Pv,其中 P u P_u Pu和 P v P_v Pv是关于参数 u u u和 v v v的偏导数
- 增加一个扰动函数(凹凸函数) b b b,在表面法向量 n = N ∣ N ∣ n=\frac{N}{|N|} n=∣N∣N方向上增加凹凸效果: P ′ ( u , v ) = P ( u , v ) + b ( u , v ) n P'(u,v)=P(u,v)+b(u,v)n P′(u,v)=P(u,v)+b(u,v)n
- 表面法向量为 N ′ = P u ′ × P v ′ N'=P'_u \times P'_v N′=Pu′×Pv′
- P P P关于 u u u的偏导数: P u ′ = ∂ ∂ u ( P + b n ) = P u + b u n + b n u P'_u=\frac{\partial}{\partial u}(P+bn)=P_u+b_un+bn_u Pu′=∂u∂(P+bn)=Pu+bun+bnu
- 假定凹凸函数 b b b很小,可以忽略最后一项得到: P u ′ ≈ P u + b u n P'_u \approx P_u + b_un Pu′≈Pu+bun
- 同理 P v ′ ≈ P v + b v n P'_v \approx P_v + b_vn Pv′≈Pv+bvn
- 扰动的表面法向量为: N ′ = P u × P v + b v ( P u × n ) + b u ( n × P v ) + b u b v ( n × n ) = P u × P v + b v ( P u × n ) + b u ( n × P v ) N'=P_u \times P_v+b_v(P_u \times n)+b_u(n \times P_v)+b_ub_v(n \times n)=P_u \times P_v+b_v(P_u \times n)+b_u(n \times P_v) N′=Pu×Pv+bv(Pu×n)+bu(n×Pv)+bubv(n×n)=Pu×Pv+bv(Pu×n)+bu(n×Pv)