跳转到内容

Heckbert 1986 — 把"贴图"这件事讲清楚的第一篇综述

是什么

Heckbert 1986 是图形学历史上第一篇把”纹理映射”这件事系统讲清楚的综述。13 页,作者 Paul Heckbert 当时在 Pixar,后来去了 CMU。

日常类比:在这篇之前,纹理映射像一个杂乱的工具箱——有人在做 UV 贴图、有人做反射、有人做凹凸,论文散在各种会议里,名词各起各的。Heckbert 就像第一个把工具箱归类、贴标签、写说明书的人。30 年后所有图形学教材的”纹理”那一章,几乎都是照着这篇的目录写的。

简单说,贴图就是把一张二维图(树皮、砖墙、人脸照片)裹到三维模型表面上,让模型看起来不光是”光秃秃的几何”。这篇论文回答了三个核心问题:

  1. 怎么决定模型表面每个点对应纹理图的哪个像素?(参数化
  2. 投影到屏幕后,纹理怎么不出锯齿、不闪烁?(反走样
  3. 除了贴颜色,还能贴什么?(环境 / 凹凸 / 高光 / 透明

为什么重要

不读这篇,你看现代图形学的很多东西会疑惑:

  • 为什么 3D 软件里每个模型都有一张叫 “UV map” 的东西?UV 是哪两个字母,怎么来的?
  • 为什么 GPU 的纹理单元都自带 MIP map各向异性过滤?是哪一年定下来的?
  • 为什么环境反射在游戏里用一个 cube 来存?为什么不用球?
  • 为什么”凹凸贴图”和”法线贴图”听起来差不多但又不一样?

这些问题的源头都在这篇综述里。Catmull 1974 写了博士论文里第一段贴图代码,Williams 1983 发明 MIP,Blinn 1978 发明凹凸——但把这些拼成一张完整地图的,是 Heckbert 1986。

之后所有图形教材(Foley/van Dam、PBR、Real-Time Rendering)的纹理章节,词汇表基本沿用这篇——texture spaceobject spacescreen spaceminificationmagnification 这些术语都是从这里固定下来的。

核心要点

Heckbert 把纹理映射拆成两阶段管线

模型几何点 ──参数化──→ (u, v) 纹理坐标 ──投影──→ (x, y) 屏幕像素
阶段 1 阶段 2

阶段 1:参数化(surface → uv)

回答”模型表面每点对应纹理哪里”。论文整理了三类做法:

  1. 内禀参数化:表面本身就有自然的 (u, v),例如样条曲面 S(u, v)。最干净,但复杂模型很难有。
  2. 二步映射:先把模型投到一个简单中介面(圆柱、球、立方体),再从中介面到平面纹理。今天 3D 软件里点 “Cylinder Project” 就是这一支。
  3. 投影映射:从某个视点把纹理像幻灯片打到模型上(projective texture),用于阴影贴图、装饰贴图。

阶段 2:投影 + 反走样(uv → 像素)

屏幕上一个像素覆盖纹理多大区域,决定要怎么采样:

  • 放大(magnification):一个像素只盖纹理不到一个 texel → 用最近邻 / 双线性重建
  • 缩小(minification):一个像素盖了纹理一大片 → 必须预滤波否则闪烁

论文把缩小的反走样方案排成谱系:

方法谁 / 哪年思路代价
空间变化滤波直接做每像素积分纹理太慢
MIP mapWilliams 1983预生成多级分辨率金字塔内存 +33%,硬件友好
求和面积表Crow 1984任意矩形区域查表数值精度问题
EWAGreene-Heckbert 1986椭圆加权平均,处理斜视角高质量,慢

今天 GPU 的”各向异性过滤”就是 EWA 的硬件简化版。

阶段 3:贴的不只是颜色

论文最后一节列了”纹理还能贴什么”:

  • 颜色纹理(diffuse map)—— 最常见
  • 凹凸映射(bump map,Blinn 1978)—— 不改几何只扰动法线
  • 环境映射(reflection map,Blinn-Newell 1976 / Greene 1986 cube)—— 假装反射环境
  • 高光 / 透明 / 位移

实践案例

案例 1:UV 这两个字母从哪来

打开 Blender,右上角看到 “UV Editor”。uv 是纹理图的横纵坐标,因为 x y z 已经被三维空间占用了,1974 年 Catmull 博士论文里第一次用 u, v 命名,Heckbert 1986 把它定为标准。所以你今天点的每个 “UV 展开”按钮,名字都来自这两篇。

案例 2:MIP map 为什么是 33% 额外内存

MIP(拉丁文 multum in parvo,意为”少中藏多”)= 把一张纹理预先压缩成 1×1, 2×2, 4×4 … 直到原图的金字塔。

原图: 1024 × 1024 → 1 M 像素
1/2 级: 512 × 512 → 0.25 M
1/4 级: 256 × 256 → 0.0625 M
...

总和 = 1 + 1/4 + 1/16 + … = 4/3 ≈ 原图的 1.33 倍。这就是”33% 额外内存”的几何级数收敛。

案例 3:环境反射为什么用 cube 不用球

Blinn-Newell 1976 用经纬度球面图(latitude-longitude)→ 两极拉伸严重。Greene 1986 改用立方体 6 面图 → 每面是普通透视投影,硬件直接采样。Heckbert 综述里把两种都列出来对比。

今天打开任何游戏引擎的 “Skybox” / “Reflection Probe”,存的就是 cube map。源头在这篇综述给出的对比表里。

踩过的坑

  1. 把”反走样”和”重建”搞混:放大用重建(双线性、双三次),缩小用预滤波(MIP)。新人常把双线性当”万能反走样”——它解决不了缩小时的莫尔条纹。

  2. 环境映射不是真反射:它假设入射光只取决于反射方向,不考虑物体位置。所以平面镜近距离反射会假——这是 1986 年的硬件限制,今天用 screen-space reflection / ray tracing 才修。

  3. 凹凸 vs 法线 vs 位移:Blinn 1978 的 bump 是只改法线(轮廓还是平的);法线贴图(normal map,1996 年才主流)是 bump 的现代形态;位移贴图(displacement)才是真改几何。论文 1986 年只能讲 bump。

  4. MIP 选哪一级:选错会模糊(选太高级)或闪烁(选太低级)。论文当年没给精确公式,OpenGL 1.0 才把这事标准化。

适用 vs 不适用场景

适用

  • 学图形学的第一篇综述(不是第一篇论文,但是第一张地图)
  • 想搞清楚为什么现代 GPU 的纹理单元长这样
  • 写自己的软件渲染器,要做反走样

不适用

  • 现代基于物理的渲染(PBR)—— 看 Disney BRDF 2012、Burley
  • 神经辐射场 / 可微渲染 —— 看 NeRF 2020 之后
  • 实时光线追踪 —— 看 RTX 时代论文

历史小故事(可跳过)

  • 1974:Catmull 博士论文里第一次把图贴到双三次 Bezier 曲面,发明 (u, v) 命名
  • 1976:Blinn-Newell 在犹他大学发明环境映射,用经纬度球面
  • 1978:Blinn 发明凹凸映射
  • 1983:Williams 在卢卡斯影业提出 MIP map
  • 1984:Crow 发明 Summed-Area Table
  • 1986:Heckbert 把以上全部整合成 13 页综述。这篇之后所有教材的纹理章节都长这个样
  • 1989:Heckbert 自己把综述扩写成博士论文 Fundamentals of Texture Mapping and Image Warping,加了完整数学

学到什么

  1. 综述 vs 论文:综述的价值不是”提新东西”,而是”给后人一张地图”。Heckbert 1986 没发明任何东西,但 30 年后所有教材作者都引它
  2. 术语标准化的力量:UV / texture space / minification 这些词从这一篇之后就固定了
  3. 反走样是图形学的核心难题之一——一像素对应纹理多大、怎么平均,至今 GPU 还在优化
  4. 理论谱系:Catmull 1974 → Blinn-Newell 1976 → Blinn 1978 → Williams 1983 → Crow 1984 → Heckbert 1986。每隔 2-3 年一个台阶,综述把台阶串成楼梯

延伸阅读

  • 论文 PDF:Heckbert 1986 PDF(13 页,密度低,新人友好)
  • 扩写版:Heckbert PhD 1989, Fundamentals of Texture Mapping and Image Warping(200+ 页完整数学)
  • 教材:Real-Time Rendering 第 6 章纹理 —— 写法基本沿用这篇结构
  • catmull-1974-subdivision —— UV 命名的源头
  • reyes-1987 —— Pixar 把反走样工程化的渲染管线

关联

  • catmull-1974-subdivision —— Catmull 博士论文,UV 与 z-buffer 同一篇
  • phong-1975 —— 光照模型,与纹理叠加
  • perlin-noise-1985 —— 程序纹理,纹理图的另一支路
  • reyes-1987 —— Pixar 渲染管线,把反走样工程化
  • 3d-gaussian-splatting —— 现代点云渲染,反走样思路有部分继承

反向链接

  • 3d-gaussian-splatting —— 3D Gaussian Splatting — 用一堆 3D 模糊光斑重建场景
  • phong-1975 —— Phong 1975 — 把光照拆成环境+漫反射+高光三项