山东大学计算机图形学期末复习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:R2→R3f : \mathbb{R}^2 \to \mathbb{R}^3f: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 0det(∂u∂f,∂v∂f)=0;
- 低扭曲:保持局部形状、面积或角度。
二、参数裂缝(Parameter Crack)问题
现象
在纹理映射中,常见的问题是“参数裂缝”:
- 当表面在纹理坐标中不连续时(例如 u=0u=0u=0 与 u=1u=1u=1 不连接);
- 会导致纹理在边缘出现断裂、跳变或缝隙。
场景示例
- 圆柱映射中,u=0u=0u=0 和 u=1u=1u=1 分别对应 θ=0\theta=0θ=0 和 θ=2π\theta=2\piθ=2π;
- 如果两个边界的纹理值不同或法线不连续,就会看到一条明显的接缝。
- 球面映射中,极点的经度未定义,可能导致多个纹理点“压缩”到极点,形成裂缝。
三、解决裂缝的高级技术 —— 保角映射(Conformal Mapping)
数学背景
保角映射是保持角度不变的映射:
若映射 f:C→Cf : \mathbb{C} \to \mathbb{C}f:C→C 满足 fff 在复平面上解析且 f′≠0f' \ne 0f′=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Δ 是网格上的拉普拉斯算子。
离散形式(即每个内部点是邻居加权平均):
ui=∑j∈N(i)wijuj
\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) 是点 iii 的邻居;
- wijw_{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)进行积分求平均。
数学建模:
设屏幕像素在纹理空间中的前像为区域 RRR,纹理图为 t(u,v)t(u, v)t(u,v),则对应像素的颜色值为:
C=1Area(R)∬Rt(u,v) du dv
C = \frac{1}{\text{Area}(R)} \iint_R t(u, v)\,du\,dv
C=Area(R)1∬Rt(u,v)dudv
难点:
- 这个区域 RRR 经过透视投影、表面参数化等变换,往往不是规则矩形,而是弯曲多边形甚至非线性形状。
- 计算积分通常需数值近似(如:多重采样、多边形裁剪、Monte Carlo 等)。
优点:
- 保留更多纹理细节,抗混叠效果好。
缺点:
- 计算开销大,实时渲染中难以使用。
二、程序化纹理(Procedural Texture)
3. 连续映射函数(Continuous Mapping)
目标:不使用图像作为纹理,而通过数学函数动态生成纹理图案。
示例函数:
t(u,v)=G+B1cos(f1u+g1v+φ1)+B2cos(f2u+g2v+φ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)
- GGG: 平均灰度或基础颜色
- B1,B2B_1, B_2B1,B2: 振幅,控制纹理强度
- fi,gif_i, g_ifi,gi: 空间频率,决定图案密度
- φi\varphi_iφi: 相位偏移,调节纹理起始位置
应用场景:
- 球面映射:u,vu, vu,v 表示球面参数 (θ,ϕ)(\theta, \phi)(θ,ϕ)
- 圆柱映射:u,vu, vu,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/41/41/4,即每边减半(宽 × 高)
示例:
- Level 0:128×128
- Level 1:64×64
- Level 2:32×32
- … 直到 Level 7:1×1
5. Mipmap 存储代价(空间开销)
数学推导:
设原始纹理为 N×NN \times NN×N,则总存储为:
S=N2+(N2)2+(N4)2+⋯=N2(1+14+116+⋯ )
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=14r = \frac{1}{4}r=41,和为:
∑k=0∞(14)k=11−14=43
\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=43N2
S = \frac{4}{3} N^2
S=34N2
即:Mipmap 的空间开销为原始纹理的约 1.331.331.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
以最大伸缩为准,定义纹理尺度 LLL:
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 级别 DDD 为:
D=log2L
D = \log_2 L
D=log2L
7. 取整与插值:三线性过滤(Trilinear Filtering)
-
DDD 是浮点数 → 对应 两个整数层级(如 2.3→2.3 \to2.3→ Level 2 与 Level 3)
-
步骤:
-
对 Level 2 和 Level 3 各做一次双线性插值,得到 C2C_2C2 和 C3C_3C3
-
在它们之间再线性插值:
C=(1−α)C2+αC3,其中 α=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:
- 在多边形顶点处计算光照强度 III。
- 然后使用线性或双线性插值在像素之间过渡强度。
问题:
- 无法捕捉曲面微细节(如皮肤纹理、砖缝凹陷)。
- 多边形越少,越容易出现“表面平滑但不真实”的问题。
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. 漫反射光照公式(用于光照计算)
光照强度 IdI_dId 通常基于 Lambertian 漫反射模型:
Id=RdIia+bd+cd2⋅(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)
其中:
- RdR_dRd: 材质的漫反射系数
- IiI_iIi: 入射光强度
- a,b,ca, b, ca,b,c: 距离衰减参数
- s\mathbf{s}s: 光源方向(单位向量)
- n\mathbf{n}n: 法线向量
简化假设(无衰减):
a=1,b=c=0⇒Id=RdIi(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=(Nx,Ny,Nz),−1≤Ni≤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=⌊(Nx+1)⋅127.5⌋,G=⌊(Ny+1)⋅127.5⌋,B=⌊(Nz+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⌋
反向解码时:
Nx=R127.5−1,同理 Ny,Nz
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 → 法线向量
- 计算光照强度(如 Id=k(s⋅n)I_d = k (\mathbf{s} \cdot \mathbf{n})Id=k(s⋅n))
- 输出最终颜色
五、高保真应用:从高模生成法线贴图(烘焙)
网格简化:

11. 工作流程(称为 Baking Normal Maps)
- 创建高多边形模型(如 30000 面)
- 渲染其每个三角形面的法线(表面细节丰富)
- 将其投影到简化的低模表面纹理空间
- 存储为法线贴图
- 在低模(如 632 面)上实时使用法线贴图 → 视觉效果逼近高模

OpenGL Texture Mapping
暂时略
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)