山东大学计算机图形学期末复习14——CG14下
CG14下
“参数化 Parameterization”与“保角映射 Conformal Mapping”
一、什么是参数化(Parameterization)
概念定义
参数化是指将一个三维表面(如模型的网格)映射到二维纹理空间的过程:
- 目的是赋予每个顶点一个纹理坐标 ( u , v ) ∈ [ 0 , 1 ] 2 (u, v) \in [0, 1]^2 (u,v)∈[0,1]2;
- 使得 2D 纹理图像能正确贴合在 3D 表面上;
- 类似于将一张贴纸展开、包裹在物体表面。
参数化的数学表达
设 f : R 2 → R 3 f : \mathbb{R}^2 \to \mathbb{R}^3 f:R2→R3 为一个从 2D 纹理空间到 3D 表面的映射:
f ( u , v ) = ( x ( u , v ) , y ( u , v ) , z ( u , v ) ) f(u,v) = (x(u,v), y(u,v), z(u,v)) f(u,v)=(x(u,v),y(u,v),z(u,v))
这个映射就是参数化函数。我们希望它满足以下目标:
- 连续: ( u , v ) (u,v) (u,v) 的小变化对应 ( x , y , z ) (x,y,z) (x,y,z) 的小变化;
- 无折叠:Jacobian det ( ∂ f ∂ u , ∂ f ∂ v ) ≠ 0 \det \left( \frac{\partial f}{\partial u}, \frac{\partial f}{\partial v} \right) \ne 0 det(∂u∂f,∂v∂f)=0;
- 低扭曲:保持局部形状、面积或角度。
二、参数裂缝(Parameter Crack)问题
现象
在纹理映射中,常见的问题是“参数裂缝”:
- 当表面在纹理坐标中不连续时(例如 u = 0 u=0 u=0 与 u = 1 u=1 u=1 不连接);
- 会导致纹理在边缘出现断裂、跳变或缝隙。
场景示例
- 圆柱映射中, u = 0 u=0 u=0 和 u = 1 u=1 u=1 分别对应 θ = 0 \theta=0 θ=0 和 θ = 2 π \theta=2\pi θ=2π;
- 如果两个边界的纹理值不同或法线不连续,就会看到一条明显的接缝。
- 球面映射中,极点的经度未定义,可能导致多个纹理点“压缩”到极点,形成裂缝。
三、解决裂缝的高级技术 —— 保角映射(Conformal Mapping)
数学背景
保角映射是保持角度不变的映射:
若映射 f : C → C f : \mathbb{C} \to \mathbb{C} f:C→C 满足 f f f 在复平面上解析且 f ′ ≠ 0 f' \ne 0 f′=0,则称其为保角映射。
- 保角映射 不保证面积,但能保持图像在局部的形状不失真;
- 广泛应用于三维网格的参数化,减少纹理扭曲。
四、保角映射的实现方法
基本思路
将三维模型展平为二维纹理域 ( u , v ) (u,v) (u,v),使得:
- 三角面片展开后角度不变(角度和仍为 π \pi π);
- 接缝平滑;
- 内部连续、边界可控。
数学形式 —— 拉普拉斯方程
对顶点的 ( u , v ) (u,v) (u,v) 坐标求解 离散拉普拉斯方程:
Δ u = 0 , Δ v = 0 \Delta u = 0,\quad \Delta v = 0 Δu=0,Δv=0
其中 Δ \Delta Δ 是网格上的拉普拉斯算子。
离散形式(即每个内部点是邻居加权平均):
u i = ∑ j ∈ N ( i ) w i j u j \mathbf{u}_i = \sum_{j \in \mathcal{N}(i)} w_{ij} \mathbf{u}_j ui=j∈N(i)∑wijuj
- N ( i ) \mathcal{N}(i) N(i) 是点 i i i 的邻居;
- w i j w_{ij} wij 是权重,常用 cotangent 权重 或均匀权重;
- 求解系统方程可得 ( u , v ) (u,v) (u,v)。
五、边界处理与展平方式
边界条件(Dirichlet Boundary)
- 固定边界顶点,内部顶点由拉普拉斯约束自动计算;
- 常见边界形状:
类型 | 说明 |
---|---|
单位圆 | 避免角度奇异点,适合保角性 |
单位正方形 | 便于 UV 包装,适合游戏中图集布局 |
展平输出结果
- 每个三角面被展平成一个平面三角形;
- 保证角度接近原始角度;
- 输出 ( u , v ) (u,v) (u,v) 可直接用作纹理坐标。
六、保角映射的效果与应用
优点:
- 局部形状扭曲最小;
- 纹理接缝更平滑;
- 适合雕塑、角色等高细节模型。
应用场景:
- 人脸贴图(UV 展开);
- 地形纹理;
- 程序化纹理生成;
- 图形学研究中的流形参数化。
七、与两阶段映射的关系
在复杂对象中,先对模型做参数化(如保角映射),再进行纹理贴图,构成一种间接映射流程:
- 三维模型 → 保角展平 → 得到 ( u , v ) (u,v) (u,v) 坐标;
- 再用 ( u , v ) (u,v) (u,v) 映射纹理图像;
- 可选:中间映射到球面/圆柱(两阶段映射)提升控制性。
覆盖抗混叠、程序化纹理与Mipmap技术
一、抗混叠技术(Anti-Aliasing)
1. 点采样(Point Sampling)
定义:在屏幕空间的每个像素,只选取一个纹理图像点 (u, v)
,直接使用其颜色。
缺点:
- 若纹理中存在高频细节(如条纹),单点可能错过该特征 → 造成 混叠(aliasing)。
- 混叠表现为:锯齿、图案消失、闪烁等视觉伪影。
2. 区域平均(Area Averaging)
原理:
不再使用一个采样点,而是对像素对应在纹理图像上的“区域”(称为前像 preimage)进行积分求平均。
数学建模:
设屏幕像素在纹理空间中的前像为区域 R R R,纹理图为 t ( u , v ) t(u, v) t(u,v),则对应像素的颜色值为:
C = 1 Area ( R ) ∬ R t ( u , v ) d u d v C = \frac{1}{\text{Area}(R)} \iint_R t(u, v)\,du\,dv C=Area(R)1∬Rt(u,v)dudv
难点:
- 这个区域 R R R 经过透视投影、表面参数化等变换,往往不是规则矩形,而是弯曲多边形甚至非线性形状。
- 计算积分通常需数值近似(如:多重采样、多边形裁剪、Monte Carlo 等)。
优点:
- 保留更多纹理细节,抗混叠效果好。
缺点:
- 计算开销大,实时渲染中难以使用。
二、程序化纹理(Procedural Texture)
3. 连续映射函数(Continuous Mapping)
目标:不使用图像作为纹理,而通过数学函数动态生成纹理图案。
示例函数:
t ( u , v ) = G + B 1 cos ( f 1 u + g 1 v + φ 1 ) + B 2 cos ( f 2 u + g 2 v + φ 2 ) t(u, v) = G + B_1 \cos(f_1 u + g_1 v + \varphi_1) + B_2 \cos(f_2 u + g_2 v + \varphi_2) t(u,v)=G+B1cos(f1u+g1v+φ1)+B2cos(f2u+g2v+φ2)
- G G G: 平均灰度或基础颜色
- B 1 , B 2 B_1, B_2 B1,B2: 振幅,控制纹理强度
- f i , g i f_i, g_i fi,gi: 空间频率,决定图案密度
- φ i \varphi_i φi: 相位偏移,调节纹理起始位置
应用场景:
- 球面映射: u , v u, v u,v 表示球面参数 ( θ , ϕ ) (\theta, \phi) (θ,ϕ)
- 圆柱映射: u , v u, v u,v 表示 ( θ , z ) (\theta, z) (θ,z)
- 可生成木纹、金属拉丝、波纹、云彩等自然纹理
三、Mipmap:多级纹理抗混叠
[深入解析纹理贴图——纹理过滤及MipMap技术-CSDN博客](https://blog.csdn.net/Mapmost/article/details/139002197?ops_request_misc=&request_id=&biz_id=102&utm_term=mip map&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-2-139002197.142v102pc_search_result_base4&spm=1018.2226.3001.4187)
由 Lance Williams 于 1983 年提出。
方法:
- 预先生成多级缩小版本的纹理图像,称为 mipmap 金字塔。
- 每层分辨率为前一层的 1 / 4 1/4 1/4,即每边减半(宽 × 高)
示例:
- Level 0:128×128
- Level 1:64×64
- Level 2:32×32
- … 直到 Level 7:1×1
5. Mipmap 存储代价(空间开销)
数学推导:
设原始纹理为 N × N N \times N N×N,则总存储为:
S = N 2 + ( N 2 ) 2 + ( N 4 ) 2 + ⋯ = N 2 ( 1 + 1 4 + 1 16 + ⋯ ) S = N^2 + \left(\frac{N}{2}\right)^2 + \left(\frac{N}{4}\right)^2 + \cdots = N^2 \left(1 + \frac{1}{4} + \frac{1}{16} + \cdots \right) S=N2+(2N)2+(4N)2+⋯=N2(1+41+161+⋯)
这是一个等比数列,公比 r = 1 4 r = \frac{1}{4} r=41,和为:
∑ k = 0 ∞ ( 1 4 ) k = 1 1 − 1 4 = 4 3 \sum_{k=0}^{\infty} \left(\frac{1}{4}\right)^k = \frac{1}{1 - \frac{1}{4}} = \frac{4}{3} k=0∑∞(41)k=1−411=34
所以总存储为:
S = 4 3 N 2 S = \frac{4}{3} N^2 S=34N2
即:Mipmap 的空间开销为原始纹理的约 1.33 1.33 1.33 倍。
6. Mipmap 屏幕像素选择级别
纹理足迹估计(texture footprint)
使用偏导数估计像素在纹理空间的伸缩程度:
∂ u ∂ x , ∂ v ∂ x , ∂ u ∂ y , ∂ v ∂ y \begin{aligned} \frac{\partial u}{\partial x},\quad \frac{\partial v}{\partial x},\quad \frac{\partial u}{\partial y},\quad \frac{\partial v}{\partial y} \end{aligned} ∂x∂u,∂x∂v,∂y∂u,∂y∂v
以最大伸缩为准,定义纹理尺度 L L L:
L = max ( ( ∂ u ∂ x ) 2 + ( ∂ v ∂ x ) 2 , ( ∂ u ∂ y ) 2 + ( ∂ v ∂ y ) 2 ) L = \max \left( \sqrt{ \left( \frac{\partial u}{\partial x} \right)^2 + \left( \frac{\partial v}{\partial x} \right)^2 }, \sqrt{ \left( \frac{\partial u}{\partial y} \right)^2 + \left( \frac{\partial v}{\partial y} \right)^2 } \right) L=max (∂x∂u)2+(∂x∂v)2,(∂y∂u)2+(∂y∂v)2
对应的 Mipmap 级别 D D D 为:
D = log 2 L D = \log_2 L D=log2L
7. 取整与插值:三线性过滤(Trilinear Filtering)
-
D D D 是浮点数 → 对应 两个整数层级(如 2.3 → 2.3 \to 2.3→ Level 2 与 Level 3)
-
步骤:
-
对 Level 2 和 Level 3 各做一次双线性插值,得到 C 2 C_2 C2 和 C 3 C_3 C3
-
在它们之间再线性插值:
C = ( 1 − α ) C 2 + α C 3 , 其中 α = D − ⌊ D ⌋ C = (1 - \alpha) C_2 + \alpha C_3,\quad \text{其中 } \alpha = D - \lfloor D \rfloor C=(1−α)C2+αC3,其中 α=D−⌊D⌋
-
-
结果:避免层级跳跃带来的颜色突变,提升平滑性。
四、高级纹理映射:Catmull 方法
8. Catmull Texture Mapping + Surface Subdivision
由 Ed Catmull 提出,属于早期的高质量纹理映射方法:
- 表面细分:将模型细分为更多小面(四边形、三角形),为每个面精准贴图。
- 优点:
- 提高贴图精度,适用于光滑曲面
- 更好处理高曲率或纹理密集区域
- 缺点:
- 算法复杂,实时渲染中较少使用
凹凸映射(Bump Mapping)与法线贴图(Normal Mapping)
一、凹凸映射的背景与动机
1. Gouraud 着色的局限
Gouraud Shading:
- 在多边形顶点处计算光照强度 I I I。
- 然后使用线性或双线性插值在像素之间过渡强度。
问题:
- 无法捕捉曲面微细节(如皮肤纹理、砖缝凹陷)。
- 多边形越少,越容易出现“表面平滑但不真实”的问题。
2. 凹凸映射的核心思想
由 Jim Blinn 在 1978 年提出,本质是:
在不改变几何模型的前提下,通过修改表面法线方向来影响光照,从而模拟表面细节。
不同于 Gouraud,只在顶点计算光照,凹凸映射强调:
- 逐像素光照计算(per-fragment lighting)。
- 使用修改后的法线来增强光照细节。
二、数学基础:从高度图导出法线
3. 表面表示与法线计算
设高度图 d ( x , y ) d(x, y) d(x,y) 表示表面高度,构建隐函数:
F ( x , y , z ) = z − d ( x , y ) = 0 F(x, y, z) = z - d(x, y) = 0 F(x,y,z)=z−d(x,y)=0
根据隐函数法线公式,法线为梯度:
∇ F = ( ∂ F ∂ x , ∂ F ∂ y , ∂ F ∂ z ) = ( − ∂ d ∂ x , − ∂ d ∂ y , 1 ) \nabla F = \left( \frac{\partial F}{\partial x}, \frac{\partial F}{\partial y}, \frac{\partial F}{\partial z} \right) = \left( -\frac{\partial d}{\partial x}, -\frac{\partial d}{\partial y}, 1 \right) ∇F=(∂x∂F,∂y∂F,∂z∂F)=(−∂x∂d,−∂y∂d,1)
所以法线向量为:
n ( x , y ) = ( − ∂ d ∂ x , − ∂ d ∂ y , 1 ) \mathbf{n}(x, y) = \left( -\frac{\partial d}{\partial x}, -\frac{\partial d}{\partial y}, 1 \right) n(x,y)=(−∂x∂d,−∂y∂d,1)
再归一化
即可。
4. 漫反射光照公式(用于光照计算)
光照强度 I d I_d Id 通常基于 Lambertian 漫反射模型:
I d = R d I i a + b d + c d 2 ⋅ ( s ⋅ n ) I_d = \frac{R_d I_i}{a + b d + c d^2} \cdot (\mathbf{s} \cdot \mathbf{n}) Id=a+bd+cd2RdIi⋅(s⋅n)
其中:
- R d R_d Rd: 材质的漫反射系数
- I i I_i Ii: 入射光强度
- a , b , c a, b, c a,b,c: 距离衰减参数
- s \mathbf{s} s: 光源方向(单位向量)
- n \mathbf{n} n: 法线向量
简化假设(无衰减):
a = 1 , b = c = 0 ⇒ I d = R d I i ( s ⋅ n ) = k ( s ⋅ n ) a = 1, \quad b = c = 0 \Rightarrow I_d = R_d I_i (\mathbf{s} \cdot \mathbf{n}) = k (\mathbf{s} \cdot \mathbf{n}) a=1,b=c=0⇒Id=RdIi(s⋅n)=k(s⋅n)
只与法线与光源的夹角有关。
三、离散实现:从高度图生成法线图
5. 离散偏导数计算(差分法)
设二维高度图为 H [ x , y ] H[x, y] H[x,y],使用差分近似导数:
∂ d ∂ x ≈ H [ x + 1 , y ] − H [ x , y ] , ∂ d ∂ y ≈ H [ x , y + 1 ] − H [ x , y ] \frac{\partial d}{\partial x} \approx H[x+1, y] - H[x, y], \quad \frac{\partial d}{\partial y} \approx H[x, y+1] - H[x, y] ∂x∂d≈H[x+1,y]−H[x,y],∂y∂d≈H[x,y+1]−H[x,y]
代入法线公式,得:
n = ( − ( H [ x + 1 , y ] − H [ x , y ] ) , − ( H [ x , y + 1 ] − H [ x , y ] ) , 1 ) \mathbf{n} = \left( -(H[x+1, y] - H[x, y]),\, -(H[x, y+1] - H[x, y]),\, 1 \right) n=(−(H[x+1,y]−H[x,y]),−(H[x,y+1]−H[x,y]),1)
归一化后作为最终法线。
6. 局限与改进动机
- 早期凹凸映射采用上述计算方式,但计算代价高。
- 适用于离线渲染,不适合实时应用。
四、法线贴图:凹凸映射的现代实现
7. 法线贴图(Normal Map)原理
核心思想:
将每个像素的法线直接编码成颜色,作为纹理贴图存储。
8. 法线编码为颜色(RGB)
设法线向量:
n = ( N x , N y , N z ) , − 1 ≤ N i ≤ 1 \mathbf{n} = (N_x, N_y, N_z), \quad -1 \leq N_i \leq 1 n=(Nx,Ny,Nz),−1≤Ni≤1
映射到 RGB 空间(0~255):
R = ⌊ ( N x + 1 ) ⋅ 127.5 ⌋ , G = ⌊ ( N y + 1 ) ⋅ 127.5 ⌋ , B = ⌊ ( N z + 1 ) ⋅ 127.5 ⌋ R = \left\lfloor (N_x + 1) \cdot 127.5 \right\rfloor, \quad G = \left\lfloor (N_y + 1) \cdot 127.5 \right\rfloor, \quad B = \left\lfloor (N_z + 1) \cdot 127.5 \right\rfloor R=⌊(Nx+1)⋅127.5⌋,G=⌊(Ny+1)⋅127.5⌋,B=⌊(Nz+1)⋅127.5⌋
反向解码时:
N x = R 127.5 − 1 , 同理 N y , N z N_x = \frac{R}{127.5} - 1, \quad \text{同理 } N_y, N_z Nx=127.5R−1,同理 Ny,Nz
9. 从高度图生成法线贴图(Normal Map)
结合前文:
- 计算偏导数(用差分法)
- 构造法线向量
- 归一化后编码为 RGB
得到的彩色图像即为法线贴图。
10. 法线贴图在 GPU 中的使用
现代 GPU 使用 片段着色器(fragment shader):
- 每个像素从法线贴图读取法线
- 解码 RGB → 法线向量
- 计算光照强度(如 I d = k ( s ⋅ n ) I_d = k (\mathbf{s} \cdot \mathbf{n}) Id=k(s⋅n))
- 输出最终颜色
五、高保真应用:从高模生成法线贴图(烘焙)
网格简化:
11. 工作流程(称为 Baking Normal Maps)
- 创建高多边形模型(如 30000 面)
- 渲染其每个三角形面的法线(表面细节丰富)
- 将其投影到简化的低模表面纹理空间
- 存储为法线贴图
- 在低模(如 632 面)上实时使用法线贴图 → 视觉效果逼近高模
OpenGL Texture Mapping
暂时略