第九章 真实感图形学
9.1 真实感图形学概述
-
真实感图形学的三部曲
-
建模:建立三维场景
-
消隐:消隐解决物体深度的显示及确认物体内的相互关系
-
渲染:消隐后,在可见面上进行敏感光泽的处理,然后绘制
-
-
本章重点词汇
-
incident light,入射光
-
diffuse,扩散,漫反射
-
specular,缩写spec,镜面的
-
refracted,折射的
-
transparent,透明的
-
Distribution,分布
-
Intensity,光强
-
9.2 颜色模型
9.2.1 颜色及颜色模型概述
-
颜色是人的视觉系统对可见光的感知结果,感知到的颜色由光波的波长决定。
-
人眼对于颜色的观察和处理是一种生理和心理现象,其机理还没有完全搞清楚。
-
视觉系统能感觉的波长范围为380~780nm。
-
颜色模型(颜色空间),是表示颜色的一种数学方法,人们用它来标定颜色。通常用三个参数表示。
-
几乎所有的颜色模型都从RGB颜色模型导出。
-
目前现有颜色模型还没有一个完全符合人的视觉感知特性、颜色本身的物理特性或发光物体和光反射物体的特性。
9.2.2 RGB颜色工业模型
-
如图所示,单位立方体中的三个角对应红色(R)、绿色(G)、蓝色(B)三基色,而其余三个角分别对应于三基色的补色——青色(C)、黄色(Y)、品红色(M)
-
从RGB单位立方体的原点即黑色(0,0,0)到白色顶点(1,1,1)的主对角线被称为灰度线,线上所有的点具有相等的分量,产生灰度色调。
9.2.3 其他颜色工业模型
-
主要用于彩色电视信号传输标准,主要有YIQ、 YUV、 YCbCr彩色模型。
-
三种彩色模型中,Y分量均代表黑白亮度分量,其余分量用于显示彩色信息。只需利用Y分量进行图像显示,彩色图像就转为灰度图像。
9.2.4 颜色视觉模型
-
以上彩色模型是从色度学或硬件实现的角度提出的
-
但用色调 (Hue)、饱和度 (Saturation,也称彩度)、亮度 (Illumination) 三要素来描述彩色空间能更好地与人的视觉特性相匹配。
-
颜色的三个基本属性 (也称人眼视觉三要素)
-
色调 (Hue):由物体反射光线中占优势的波长决定的,是彩色互相区分的基本特性。
-
饱和度 (Saturation)或彩度:彩色的深浅程度,它取决于彩色中白色的含量。饱和度越高,彩色越深,白色光越少。
-
亮度 (Illumination):光波作用于感受器所发生的效应,它取决于物体的反射系数。反射系数越大,物体亮度越大。
-
-
HSI 彩色模型
是截面为三角形或圆形的锥体模型。
-
H,色调,颜色的外观,用角度表示:如赤橙黄绿青蓝紫
-
S,饱和度,分为
低(0%~20%),不管色调如何而产生灰色
中(40%~60%),产生柔和的色泽(pastel)
高(80%~100%),产生鲜艳的颜色(vivid color)
-
I,光照,颜色的量度,取值范围从0%(黑)~100%(最亮)
-
-
HSV彩色模型
(Hue,Saturation,Value)
- HSL采用亮度L(lightness)、HSV采用明度V(value)作为坐标。
9.3 简单光照模型
光照明模型:illumination model,模拟物体表面的光照明物理现象的数学模型。简单光照明模型只考虑光源对物体的直接光照。
9.3.1 光照模型的发展
-
1967年,Wylie 等人第一次在显示物体时加进光照效果,认为光强与距离成反比。
-
1970年,Bouknight 提出第一个光反射模型:Lambert 漫反射+环境光(第一个可用的光照模型)。
-
1971年,Gouraud 提出漫反射模型加插值的思想(漫反射的意思是光强主要取决于入射光的强度和入射光与法线的夹角)。
-
1975年,Phong 提出图形学中第一个最有影响的光照明模型 。在漫反射模型的基础上加进了高光项。
9.3.2 光照背景物理知识
-
反射定律:入射角等于反射角,而且反射光线、入射光线与法向量在同一平面上。
-
折射定律:折射线在入射线与法线构成的平面上,折射角与入射角满足:$\frac{\eta_1}{\eta_2} = \frac{sin \varphi}{sin \theta}$,参数是折射率和折射角
-
能量守恒: $I_i = I_d+I_s+I_t+I_v$,入射光强=漫反射光强+镜面反射光强+折射光强+吸收光强
-
漫反射光:光线射到物体表面上后(比如泥塑物体的表面,没有一点镜面效果),光线会沿着不同的方向等量的散射出去的现象。漫反射光均匀向各方向传播,与视点无关,它是由表面的粗糙不平引起的。
-
镜面反射光:一束光照射到一面镜子上或不绣钢的表面,光线会沿着反射光方向全部反射出去,这种叫镜面反射光。
-
折射光:比如水晶、玻璃等,光线会穿过去一直往前走。
-
吸收光:比如冬天晒太阳会感觉到温暖,这是因为吸收了太阳光。
-
9.3.3 Phong光照模型
==Phong光照模型 = 环境光+漫反射光+镜面反射光==
单一光源照射下Phong光照模型:$I = I_aK_a+I_pK_dcos\theta+I_pK_scos^n\alpha$
常用形式:$I = I_aK_a+I_pK_d(L·N)+ I_pK_s(R·V)^n$,L是已知光源,V是视线的方向,R是反射光可计算出来,N是物体表面的法向可计算
-
环境光,$I_{\text{ambient}} = I_aK_a$,$I_a$ 环境光强度,$K_a$ 环境光反射系数
邻近各物体所产生的光的多次反射最终达到平衡时的一种光。可近似认为同一环境下的环境光,其光强分布是均匀的。
-
漫反射光,$I_{\text{diffuse}}=I_pK_d(L·N) ,cos\theta=L·N$,$I_p$点光源光强,$K_a$物体表面漫反射率
光照射到比较粗糙的物体表面,物体表面某点的明暗程度不随观测者的位置变化,这种等同地向各个方向散射的现象称为光的漫反射。漫反射光强近似服从 Lambert 定律
-
镜面反射光,$I_{\text{spec}} = I_pK_s(R·V)^n ,cos\alpha=R·V$,$I_p$点光源光强,$K_s$物体表面某点的高光亮稀疏,$n$镜面反射指数,取值1-2000,反映光滑程度
光照射到相当光滑的物体表面,产生镜面反射光,其特点是在光滑表面会产生高光区域。
结合RGB颜色模型后,$\begin{cases} I_r = I_{ar}K_{ar} +I_{pr}K_{dr}(L·N)+I_{pr}K_{sr}(R·V)^n \ I_g = I_{ag}K_{ag} +I_{pg}K_{dg}(L·N)+I_{pg}K_{sg}(R·V)^n\ I_b = I_{ab}K_{ab} +I_{pb}K_{db}(L·N)+I_{pb}K_{sb}(R·V)^n \end{cases}$
Phong模型扫描线算法:其中$(r,g,b) = k_a(r_{pa},g_{pa},b_{pa}) + \sum ( k_d(r_{pa},g_{pd},b_{pd})cos\theta+k_s(r_{ps},g_{ps},b_{ps})cos^n\alpha)$
1
2
3
4
5
6
7
8
9
10
11
12
13
for 屏幕上每一条扫描线y do
begin
将数组Color初始化成为y扫描线的背景颜色值
for y扫描线上的每一可见区间段s中的每个点(x,y) do
begin
设(x,y)对应的空间可见点为P
求出P点处的单位法向量N、P点的单位入射光向量L、单位视线向量V
求出L在P点的单位镜面反射向量R
(r,g,b) = 代码块外的那个公式
置Color(x,y) = (r,g,b)
end
显示Color
end
Phong示例:
Phong总结:
-
它是真实感图形学中提出的第一个有影响的光照明模型,生成图象的真实度已经达到可以接受的程度。
-
其模拟光从物体表面到观察者眼睛的反射。尽管这种方法符合一些基本的物理法则,但它更多的是基于对现象的观察,所以被看成是一种经验式的方法。
-
实际应用中,这个经验模型还有以下问题
-
显示出的物体像塑料,无质感变化
-
没有考虑物体间相互反射光
-
镜面反射颜色与材质无关
-
镜面反射入射角大,会产生失真现象
-
9.4 增量式光照模型
9.4.1 光暗处理
-
光暗处理的必要性
-
三维物体通常用多边形(三角形)来近似模拟。
-
由于每一个多边形的法向一致,因而多边形内部的象素颜色相同,而且在不同法向的多边形邻接处,光强突变,使具
-
有不同光强的两个相邻区域之间的光强不连续性(马赫带效应)。
-
-
明暗处理
-
思想:每一个多边形的顶点处计算出光照强度或参数,然后在各个多边形内部进行均匀插值
-
方法
-
Gouraud明暗处理(双线性光强插值算法)
-
Phong明暗处理(双线性法向插值算法)
-
-
9.4.2 Gouraud明暗处理
-
核心:双线性光强插值
-
算法过程
-
计算多边形顶点的平均法向。
-
与某个顶点相邻的所有多边形的法向平均值近似作为该顶点的近似法向量,顶点A相邻的多边形有k个,它的法向量计算为:
$N_\alpha = \frac{1}{k} (N_1+N_2+\cdots +N_k)$
-
-
用Phong光照模型计算顶点的光强
-
Phong光照模型出现前,采用如下光照模型计算:
$I = I_aK_a+I_pK_d\frac{(L·N_\alpha)}{r+k}$
-
-
插值计算离散边上个点的光强
-
$I_A = uI_1 +(1-u)I_2,u=\frac{AV_2}{V_1V_2} \ I_B = vI_1+(1-v)I_3,v=\frac{BV_3}{V_1V_3}$
-
-
插值计算多边形内域中各点的光强
-
$I_p = tI_A + (1-t)I_B,t=\frac{PB}{AB}$
求任一点的光强需要进行两次插值计算
-
-
-
扫描线增量思想的优化
-
离散边上个点的光强
- $I_{A,j+1} = I_{A,j} + \Delta I_A \ I_{B,j+1} = I_{B,j} + \Delta I_B\ \Delta I_A = \frac{I_1-I_2}{y_1-y_2} \ \Delta I_B = \frac{I_1-I_3}{y_1-y_3}$
-
扫描线内部
- $I_{i+1, p} = I_{i,p} + \Delta I_p \ \Delta I_p = \frac{I_B-I_A}{x_B-x_A}$
-
9.4.3 Phong明暗处理
-
Gouraud明暗处理的不足
-
不能有镜面反射光(高光)
-
双线性插值是把能量往四周均匀,平均的结果就是光斑被扩大了,本来没光斑的地方插值后反而出现了光斑。
-
Phong明暗处理以计算量、时间为代价,引入镜面反射,解决高光问题
-
-
算法过程
-
计算每个多边形顶点处的平均单位法矢量(与Gouraud明暗处理方法的第一步相同)
-
用双线性插值方法求得多边形内部各点的法矢量
$N_A$ 由 $N_1$ 和 $N_2$ 线性插值而来
$N_B$ 由 $N_1$ 和 $N_3$ 线性插值而来
$N_P$ 由 $N_A$ 和 $N_B$ 线性插值而来
-
按光照模型确定多边形内部各点的光强
- 两种增量式光照模型比较
Phong方法 | Gouraud方法 |
---|---|
产生的效果高光明显 | 效果并不明显 |
高光多位于多边形内部 | 多边形内部无高光 |
明暗变化缺乏层次感 | 光强度变化均匀,与实际效果更接近 |
计算量大 | 计算量小 |
-
增量式光照模型的不足
-
物体边缘轮廓是折线段而非光滑曲线
-
等间距扫描线会产生不均匀效果
-
插值结果取决于插值方向
-
局部光照模型
简单光照模型是一个比较粗糙的经验模型,不足之处在于镜面反射项与物体表面的材质无关
9.5 局部光照模型
9.5.1 局部光照模型概述
-
仅处理光源直接照射物体表面,不处理物体间反射的影响
-
相对于简单光照模型的优点
-
基于入射光能量导出的光辐射模型
-
反映表面的粗糙度对反射光强的影响
-
高光颜色与材料的物理性质有关
-
改进入射角很大时的失真现象
-
考虑了物体材质的影响,可以模拟磨光的金属光泽
-
9.5.2 理论基础
光的电磁理论
-
光波是电磁波的一种,自然光照射到物体表面的反射光,其反射率系数 $\rho$ 可由 Fresnel 公式计算:
$\large \rho = \frac{1}{2}(\frac{tg^2(\theta - \psi)}{tg^2(\theta+\psi)} + \frac{sin^2(\theta - \psi)}{sin^2(\theta + \psi)})$
-
$\theta$ 是入射角, $\psi$ 是折射角, $\eta_1,\eta_2$ 是发生反射的物体表面两侧折射率,其中 $sin\psi = \frac{\eta_1}{\eta_2} sin\theta$
-
反射率 $\rho$ 与折射率有关,是波长的函数 $\rho (\theta, \lambda)$
微平面理论
-
将粗糙物体表面看成是由无数个微小的理想镜面组成,这些镜面朝向各异,随机分布,所以可用分布函数去描述
-
综合各种原因后,物体的反射率可以这样计算:
-
$DG\rho(\theta, \lambda)$
D 为微平面法向的分布函数
G 为由于微平面的相互遮挡或屏蔽而使光产生的衰减因子
-
-
Gauss分布函数模拟法向分布(Torrance 和 Sparrow 两人用 Gauss 高斯分布来模拟,也可用 Berkmann 分布)
-
$D = ke^{-(a/m)^2}$
k 为常系数
a 为微平面的法向与平均法向的夹角,即 $(N·H)$
m 为微平面斜率的均方根,表示表面的粗糙程度,$m =\sqrt{\frac{m_1^2+m_2^2+\cdots +m_n^2}{n}}$
-
-
衰减因子 G 也可反映物体表面的粗糙程度
-
$G =min(1, G_m, G_s)$
下图分别是无遮挡、反射光被遮挡、入射光被遮挡的情况
-
9.5.3 局部光照明模型
-
数学定义
-
$I_r$ 反射光光强,$E_i$ 单位时间内单位面积上的入射光能量
-
$R_{bd}$ 物体表面对入射自然光的反射率系数,$R_{bd} = \frac{I_r}{E_i}$
-
入射光能量 $E_i$ 可表示为 $E_i = I_i cos\theta · d\omega = I_i (N·L) d\omega$
- 反射光光强:$I_r = R_{bd} I_i (N·L) d\omega$
-
-
反射率系数
- 反射率系数可表示为漫反射率和镜面反射率的代数和:$R_{bd} = K_d R_d + K_s R_s \ K_d+K_s =1 \ R_d = R_d(\lambda) \ R_s = \frac{DG\rho(\theta, \lambda)}{\pi (N·L)(N·V)}$
-
局部光照模型
- 局部光照模型表示为:$ I_r = I_a K_a + I_i (N·L) d \omega (K_dR_d + K_sR_s)$
9.6 光透射模型
9.6.1 光透射模型概述
-
简单和局部光照模型没有考虑光的透射现象
-
其适用于场景中有透明或者半透明的物体的光照处理
-
早期用颜色调和法进行光透射模拟
9.6.2 颜色调和法
-
$I = t\times I_b +(1-t) \times I_a$
-
不考虑透明体对光的折射以及透明物体本身的厚度,光通过物体表面是不会改变方向的,可以模拟平面玻璃。
9.6.3 Whitted 光透射模型
-
提出了第一个整体光照模型,并给出了一般光线跟踪算法的范例,综合考虑了光的反射、折射、透射和阴影等。被认为是计算机图形领域的一个里程碑。
-
即在简单光照明模型的基础上,加上透射光项、镜面反射光项
-
$ I = I_a · K_a + I_p·K_d·(L·N)+I_p·K_s·(R·V)^n + I_t’·K_t’+I_s’ · K_s’$
9.7 整体光照模型
9.7.1 整体光照模型的诞生
-
简单和局部光照模型不能很好地模拟光的折射、反射和阴影等,也不能用来表示物体间的相互光照影响。
-
整体光照模型有光线跟踪、辐射度两种方法
光线跟踪效果图如下
9.7.2 光线跟踪基本过程
-
如图,点光源 L,透明体 $O_1, O_2$ ,不透明体 $O_3$
-
首先,视线 E 从视点出发,过视屏一个像素点,到达球体 $O_1$ 交于点 $P_1$
-
交点:从 $P_1$ 向光源 $L $ 作一条阴影测试线 $S_1$ ,发现期间没有遮挡的物体,用局部光照模型计算光源对 $P_1$ 在其视线 E 方向上的光强作为局部光强
-
在交点产生衍生的光线
-
反射光线 $R_1$ 方向,没有再与其他物体相交,设该方向的光强为 0,结束 $R_1$ 的跟踪
-
折射光线 $T_1$ 方向,与 $O_1$ 交于点 $P_2$,由于点在物体内部,假设它的局部光强为 0
-
反射光线 $R_2$,可递归跟踪下去计算光强
-
看折射光线 $T_2$,与 $O_3$ 交于点 $P_3$,作阴影测试线 $S_3 $,无遮挡,计算该点局部光强。并且该点还产生了 $R_3$ 可以继续跟踪下去…
-
-
9.7.3 光线跟踪的停止
-
该光线未碰到任何物体
-
该光线碰到了背景
-
光线在经过许多次反射和折射以后,就会产生衰减,光线对于视点的光强贡献很小
-
光线反射或折射次数即跟踪深度大于一定值
光线跟踪伪码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
RayTracing(start, direction, weight, ret_color)
{
if(weight < MinWeight) ret_color = BLACK;
else
{
计算光线与所有物体的交点中离start最近的点;
if(无交点) ret_color = BLACK;
else
{
I_local = 在交点处用局部光照模型计算出的光强;
计算反射方向R;
RayTracing(最近的交点, R, weight*W_r, I_r);
计算折射方向T;
RayTracing(最近的交点, T, weight*W_t, I_t);
ret_color = I_local + K_r * I_r + K_t * I_t;
}
}
}
9.7.4 光线跟踪的加速
-
光线跟踪问题
- 光线跟踪进行大量的求交运算,效率低
-
加速方案
-
提高求交速度:针对性的几何算法、…
-
减少求交次数:包围盒、空间索引、…
-
包围盒求交测试 (先和包围盒求交,有交点再和内部图形求交)
-
层次包围盒求交测试
-
-
减少光线条数:颜色插值、自适应控制、…
-
采用广义光线和采用并行算法等
-
9.8 纹理映射
9.8.1 纹理映射作用
-
表面用纹理来代替,不用构造模型和材质细节,节省时间和资源
-
可用一个粗糙多边形和纹理来代替详细的几何构造模型,节省时间和资源
-
让用户做其他更重要的东西
9.8.2 纹理分类
-
颜色纹理:颜色或明暗度变化体现出来的表面细节,如刨光木材表面上的木纹。
-
几何纹理:由不规则的细小凹凸体现出来的表面细节,如桔子皮表面的皱纹。
9.8.3 纹理定义
-
图象纹理:将二维纹理图案映射到三维物体表面,绘制物体表面上一点时,采用相应的纹理图案中相应点的颜色值
-
函数纹理:用数学函数定义简单的二维纹理图案,如方格地毯;或用数学函数定义随机高度场,生成表面粗糙纹理即几何纹理
9.8.4 纹理映射
纹理映射 (Texture Mapping)
-
通过将数字化的纹理图像覆盖或投射到物体表面,而为物体表面增加表面细节的过程
-
寻找一种从纹理空间(u,v)到三维曲面(s, t)之间的映射关系,将点(u,v)对应的彩色参数值映射到相应的三维曲面(s, t)上,使三维曲面表面得到彩色图案
-
两种方法
-
在绘制一个三角形时,为每个顶点指定纹理坐标,三角形内部点的纹理坐标由纹理三角形的对应点确定。即指定:$\begin{cases} (x_0,y_0,z_0) \rightarrow (u_0,v_0) \ (x_1,y_1,z_1) \rightarrow (u_1,v_1)\ (x_2,y_2,z_2) \rightarrow (u_2,v_2)\end{cases}$
-
指定映射关系,如 $\begin{cases} u=a_0x+a_1y+a_2z+a_3 \ v=b_0x+b_1y+b_2z+b_3 \end{cases}$
-
-
扰动函数 $P(u,v)$
-
通过对景物表面各采样点的位置作微小扰动来改变表面的微观几何形状。
-
几何纹理使用一个称为扰动函数的数学函数进行定义。
-
设景物表面的参数方程 $Q=Q(u,v)$ ,表面任一点的法线 $N = N(u,v) = \frac{Q_u(u,v) \times Q_v(u,v)}{|Q_u(u,v) \times Q_v(u,v)|}$
- 则扰动后的表面为 $Q’ = Q(u,v) + P(u,v)·N$
-
9.9 阴影处理
9.9.1 阴影定义
-
阴影是由于观察方向与光源方向不重合而造成的
-
阴影使人感到画面上景物的远近深浅,从而极大地增强画面的真实感
9.9.2 阴影分类
-
本影:不被任何光源所照到的区域Umbra。
-
半影:被部分光源所照到的区域Penumbra
-
自身阴影:由于物体自身的遮挡而使光线照射不到它上面的某些面
-
投射阴影:由于物体遮挡光线,使场景中位于它后面的物体或区域受不到光照射而形成的。
9.9.3 阴影体法
阴影算法 —— 阴影体法 (Shadow Volume)
-
由一个点光源和一个三角形可以生成一个无限大的阴影体。落在这个阴影体中的物体,就处于阴影中。
-
在对光线进行跟踪的过程中,若射线穿过了阴影体的一个正面(朝向视点的面),则计数器加1。若射线穿过了阴影体的一个背面(背向视点的面),则计数器减1。
最终计数器大于0,则说明这个像素处于阴影中,否则处于阴影之外。
9.9.4 阴影图法
阴影算法——阴影图法(Shadow Mapping):
-
思想是使用Z缓冲器算法,从投射阴影的光源位置对整个场景进行绘制。
-
对于Z缓冲器的每一个象素,它的z深度值包括了这个像素到距离光源最近点的物体的距离。一般将Z缓冲器中的整个内容称为阴影图(Shadow Map),有时候也称为阴影深度图。
-
从视点的角度来进行,对场景进行二次绘制。
-
在对每个图元进行绘制的时候,将它们的位置与阴影图进行比较,如果绘制点距离光源比阴影图中的数值还要远,那么这个点就在阴影中,否则就不在阴影中。