Skip to content

贴图技术

贴图是将二维图像映射到三维模型表面的技术,通过在纹理空间中预计算各种表面属性来避免在运行时进行复杂的几何或物理计算,是以空间换时间的关键优化手段。

// 深入理解:贴图不是图!而是使用图片格式存储的矩阵数据

UV 映射原理

UV 映射建立了三维模型顶点与二维纹理空间的对应关系,每个顶点除了空间坐标 (x,y,z) 外还携带纹理坐标 (u,v)。纹理坐标通常归一化到 [0,1] 区间,u 对应纹理的水平方向,v 对应垂直方向,纹理左下角为 (0,0),右上角为 (1,1)。光栅化阶段通过重心坐标插值顶点的纹理坐标,获得每个像素对应的纹理坐标,再使用该坐标从纹理中采样。

纹理寻址模式

纹理坐标超出 [0,1] 范围时的行为由寻址模式决定。Repeat 模式通过 uvuv 将坐标折回 [0,1],适合砖墙、地板等重复图案。Clamp to Edge 模式将坐标截断到边界,在 [0.5/n,10.5/n] 范围外返回边缘纹素值,避免边缘伪影。Mirror 模式在每 [0,1] 区间内翻转坐标,实现无缝镜像重复,适合需要连续性的纹理。Border Color 模式直接返回指定的边界颜色,常用于立方体贴图的边缘处理。

纹理过滤

纹理坐标在屏幕空间对应的像素与纹理空间的纹素很少能精确对齐,需要通过插值计算合适的颜色值。Nearest Neighbor 直接选择最近的纹素,速度快但会产生锯齿和方块感,适合像素艺术风格。Bilinear Interpolation 对最近四个纹素进行双线性插值,通过 (1Δx)(1Δy) 等权重计算,能平滑纹理但会使远距离纹理模糊。Trilinear Interpolation 在相邻两个 mip 层级间进行插值,消除层级切换时的突变带。各向异性过滤沿纹理梯度主轴方向采样多个纹素,在倾斜视角下保持纹理清晰度。

颜色贴图

颜色贴图(Diffuse/Albedo Map)存储物体表面的基础颜色,是渲染中最基础也是最常用的贴图类型。漫反射贴图假设光照已经"烘焙"进纹理中,因此 shader 中只需应用微弱的光照计算。反照率贴图则不包含任何光影信息,只记录材质本身的颜色,需要配合完整的光照模型使用。制作反照率贴图时应避免包含阴影、高光或环境反射,以确保材质在不同光照环境下表现一致。

法线贴图

法线贴图存储表面法线方向的偏移,每个纹素的 RGB 通道对应法线的 (x,y,z) 分量。由于 z 分量始终为正且满足 x2+y2+z2=1,某些格式只存储 xy 两个通道,运行时重构 z=1x2y2。切线空间法线贴图将法线存储在局部坐标系中,z 轴指向表面外侧,可复用到不同几何体。模型空间法线贴图直接存储绝对法线方向,适合复杂静态模型。法线贴图通常使用两个通道的 8 位精度存储,可能导致精度损失,某些引擎使用 10 位或更高精度来缓解。

高度贴图与视差映射

高度贴图(Height Map)在单通道中存储表面高度信息,白色表示高处,黑色表示低处。Steep Parallax Mapping 通过沿视线方向多次探测高度贴图来计算 UV 偏移,采样次数越多效果越好但开销越大。Parallax Occlusion Mapping 增加了遮挡检测,能正确处理高处的遮挡关系,是实时渲染中效果最好的视差技术。Relief Mapping 使用二分搜索或圆锥步进算法,用较少的采样次数达到较高的质量。Displacement Mapping 真正修改几何体顶点位置,需要使用细分着色器(Tessellation Shader)或位移映射器(Displacement Map),计算开销巨大但能产生自阴影效果。

粗糙度与金属度贴图

PBR 工作流中用粗糙度贴图(Roughness Map)和金属度贴图(Metallic Map)描述材质表面特性。粗糙度值从 0(光滑镜面)到 1(完全粗糙),控制高光的扩散程度和清晰度。金属度值为 0 表示非金属(电介质),值为 1 表示金属,介于之间表示半金属或涂层金属。工程中常将两者合并为一张贴图的 RG 通道,节省纹理采样和内存开销。非金属的镜面反射率固定在 0.04 左右,金属则可高达 0.8-1.0,这也是为什么金属看起来更"亮"的根本原因。

环境光遮蔽贴图

环境光遮蔽贴图(AO Map)预计算了表面的几何凹陷和缝隙处接收环境光较少的效果,在渲染时作为环境光的调制因子。弯曲面片的凹陷处、物体接触面、缝隙和孔洞处 AO 值较低,表现为暗色。AO 不依赖视线方向,可预计算并烘焙到纹理中,常与反照率贴图相乘或叠加。屏幕空间环境光遮蔽(SSAO)在运行时通过深度缓冲采样周围像素估计遮蔽,需要额外的渲染通道但能处理动态物体。基于球谐函数(SH)的预烘焙 AO 能考虑方向性信息,质量更高但存储开销更大。

自发光贴图

自发光贴图(Emissive Map)存储物体自身发光的部位和颜色,常用于霓虹灯、屏幕、火焰、魔法效果等。自发光在渲染后期与场景光照结果相加,不受光照和阴影影响,能产生"发光"的视觉效果。Bloom 后处理效果提取高亮的自发光区域并模糊后叠加到画面上,模拟真实相机的光晕效果,大幅增强自发光的真实感。自发光贴图通常使用 HDR 格式存储,以支持超过 1.0 的高亮度值。

光照贴图

光照贴图(Lightmap)将场景的静态光照(直接光和间接光)烘焙到纹理中,运行时只需采样贴图而无需计算光照。每个静态物体分配独立的 UV 通道(通常称为 Lightmap UV),要求无重叠且密度均匀,通过 3D 建模软件的自动展开工具生成。光照贴图分辨率通常在 64x64 到 256x256 之间,使用 HDR 格式存储以保留高动态范围的光照信息。 Enlighten、Beast、xatlas 等光照烘焙系统支持实时全局光照更新,适合动态时间变化的场景。光照贴图的主要缺点是无法处理动态光源和移动物体,需要通过光照探针(Light Probe)和探针体积(Probe Volume)来补充。

立方体贴图与天空盒

立方体贴图(Cubemap)由六个面的纹理组成,模拟从中心点向各个方向观察的场景。用于天空盒(Skybox)时渲染在远处的球体或立方体上,给予环境感。用于环境反射时通过表面法线反射视线方向采样,模拟金属等光滑表面的环境反射。通过预过滤不同粗糙度的立方体贴图(Prefiltered Environment Map),可实现基于粗糙度的模糊反射,这是现代 PBR 中的标准做法。立方体贴图的边缘需要使用无缝过滤或特殊采样方式,避免接缝处的颜色跳变。球谐光照(Spherical Harmonics Lighting)将环境光投影到低频球谐基函数上,用几个系数向量表示漫反射环境光照,计算高效但只能表达低频光照。

细节贴图

细节贴图(Detail Map)通常是小尺寸的无缝纹理,通过平铺(Tiling)方式叠加到基础纹理上增加表面细节。细节纹理的 UV 坐标通过乘以平铺系数(Tiling)来缩放,产生重复图案的效果。Detail Mask 贴图控制细节纹理在不同区域的混合强度,如只在衣服的褶皱处叠加织物纹理。细节贴图特别适合表现近距离观察时的微观细节,如织物的编织纹理、混凝土的颗粒感,而无需使用极高分辨率的基础纹理。

顶点绘制

顶点绘制(Vertex Painting)将颜色或属性直接存储在顶点数据中,光栅化时插值到像素。常用于地形的材质混合(草地、泥土、岩石)、风化效果、旧化处理等。每个顶点可存储多组顶点颜色,用于控制不同细节层的混合权重。顶点绘制的优点是不需要额外的 UV 通道和纹理采样,缺点是精度受顶点密度限制,不适合表现锐利的边界变化。基于距离的顶点混合可在运行时动态计算,实现渐变的材质过渡效果。

贴图通道打包

为减少纹理采样次数和内存占用,常将不相关的贴图通道打包到同一张纹理的不同通道中。金属度/粗糙度工作流将金属度存储在 B 通道、粗糙度存储在 G 通道,R 和 A 通道可用于其他用途或留空。环境光遮蔽、粗糙度、金属度可打包为 ARM 贴图。法线贴图如果使用双通道格式,剩余的两个通道可用于存储其他数据。通道打包需要在 shader 中正确解包,并注意不同通道的精度要求差异,某些通道可能需要更高的精度。

程序化纹理生成

程序化纹理通过数学函数或噪声算法实时生成纹理,无需存储纹理文件。Perlin Noise、Simplex Noise、Worley Noise 等噪声函数是生成自然纹理的基础。通过分层叠加不同频率和振幅的噪声(分形布朗运动 FBM),可产生云层、地形、火焰等复杂的自然图案。程序化纹理的优点是无限分辨率、可动态变化且不占用存储空间,缺点是计算开销大且难以精确控制视觉效果。Substance Designer 等工具提供节点化的程序化纹理编辑流程,输出最终的位图纹理或 shader 代码。

法线贴图技术

法线贴图将表面细节编码到法线纹理中,每个纹素存储 (x,y,z) 归一化后的法线向量,z 分量可通过 1x2y2 重构因此某些格式只存储 xy 两个通道。

切线空间法线贴图

切线空间法线贴图将法线存储在三角形局部坐标系中,z 轴指向表面外侧,xy 轴分别对应纹理坐标的 uv 方向。这种方式将法线与三角形解耦,同一张法线贴图可以应用到任意朝向的表面上。在 shader 中需要构建 TBN 矩阵将切线空间的法线变换到世界空间,nworld=TBNntangent,TBN 矩阵由切线 t、副切线 b=cross(n,t) 和法线 n 组成。切线通常由 3D 建模软件计算并存储在顶点数据中,如果切线数据缺失也可以通过相邻顶点的纹理坐标差分近似计算。

Object Space 和 World Space 法线贴图

Object Space 法线贴图在世界空间或模型空间中存储绝对法线方向,不需要 TBN 变换,适合不规则的静态物体如岩石、树木。这种方式无法复用到不同几何体,但可以更好地处理锐利的边缘和法线不连续的情况。World Space 法线贴图直接存储世界空间的法线,通常用于烘焙光照信息(光照贴图),当物体移动时需要重新计算。

法线贴图细节

法线贴图的强度系数允许在运行时缩放法线的 xy 分量,控制凹凸效果的明显程度。法线贴图通常与高度图结合使用,高度图记录表面高度偏移,可以通过 Sobel 算子计算法线。法线贴图不能产生真正的自遮蔽和自投影效果,需要配合视差贴图(Parallax Mapping)或置换贴图(Displacement Mapping)使用。

纹理优化策略

纹理内存带宽通常是实时渲染的瓶颈所在,现代 GPU 的纹理缓存层级设计对访问模式非常敏感。

Mipmap 技术

Mipmap 通过预生成多级纹理来减少远距离纹理采样时的缓存未命中,每级纹理是上一级的 2x2 下采样,纹理尺寸减少到 1/4。采样时根据纹理梯度 uv 自动选择合适的 mip 层级 d=max(0,12log2(u2+v2)),在层级之间进行三线性插值。Mipmap 的代价是额外增加约 1/3 的显存占用(i=01/4i=4/3),换来的是大幅提升的缓存命中率和减少的纹理噪点。使用 Mipmap 还需注意 mip 射纹(mip bands)问题,可通过 gamma 校正或各向异性过滤缓解。

各向异性过滤

当表面与视线夹角较大时,纹理空间的一个像素对应屏幕空间的多个像素,需要采样更多纹素来保证质量。各向异性过滤(AF)沿纹理梯度的主轴方向采样多个纹素(16x AF 意味着最多采样 16 个),采样形状通常是椭圆形而非圆形。AF 的计算开销随各向异性程度增加,现代 GPU 支持 2x 到 16x 的 AF 等级,工程中常设置为 8x 或 16x 以平衡质量和性能。

纹理压缩

纹理压缩格式通过块压缩(BC)或自适应标量量化(ASTC)降低显存占用和解压带宽。BC1(DXT1)压缩比为 6:1 但不支持 alpha 通道,BC3(DXT5)支持独立的 alpha 通道。ASTC 格式更灵活,支持 4x4 到 12x12 的不同块大小,压缩比可达 3.6:1 到 25:1,质量明显优于 BC 格式。压缩纹理在 GPU 上硬件解压,几乎不增加运行时开销,但压缩过程是有损的,可能在平滑渐变区域产生块状伪影,需要精心选择压缩参数。