中EN
概念页

多边形三角化

Polygon Triangulation

模型数据很少恰好是渲染需要的格式。图形 API 和硬件都针对三角形优化,所以复杂多边形要先剖分 (tessellation),最常见的是三角化 (triangulation)。本页讲三维数据的来源、三角化算法(耳切法、凸剖分、模板缓冲法)、四边形对角线选择与纹理扭曲,以及边缘裂缝和 T 型顶点。

多边形技术总览(16 章引言)

第 16 章涵盖五类处理,目标都是视觉精度与速度("精度"取决于场景:工程师要看到每个倒角,游戏中高帧率下单帧小错可以接受):

flowchart LR
  A["剖分/三角化: 保证正确显示"] --> B["整合: 合并为网格, 生成法线"]
  B --> C["优化: 重排以加速渲染"]
  C --> D["简化: 去掉不重要的三角形"]
  D --> E["压缩: 减少存储与带宽"]

如上图,后一步建立在前一步之上,分别对应本页、网格整合与顶点法线、三角形带、扇与索引网格、网格简化 和 顶点压缩与精度。

三维数据从哪来(16.1 节)

手工输入、过程建模、从其他数据转换(如蛋白质数据转成球和圆柱)、建模软件、摄影测量、三维扫描、从 CT/MRI 等体数据生成等值面,或这些方法的组合。

  • 实体建模器(CAD)用严格的拓扑引擎,靠 faceter 把内部表示转成三角形显示;有时最简单的提速就是调低 faceter 的精度。注意 faceter 是否为图形渲染设计:有限元用的 faceter 追求近似等面积三角形,3D 打印用的常缺顶点法线,这类数据都适合简化。
  • 曲面建模器(Blender、Maya)以表面定义物体;隐式曲面(metaball)建模器用移动立方体等多边形化。点云常适合简化。
  • 关键是理解数据如何、为何而生成;不同文件格式之间转换往往有损。

剖分的目标(16.2 节)

  • 三角化、凸剖分(算法只处理凸多边形时)、为存储全局光照结果做均匀网格化等。
  • Delaunay 三角化要求每个三角形外接圆不包含其他顶点,可最大化最小角。细长三角形应尽量避免:远距离顶点间插值易出伪影,光栅化也低效。
  • 非平面多边形:例如侧看扭曲的四边形形成"沙漏 / 领结"。快速补救是把顶点投影到垂直于近似法线的平面上;法线用 Newell 公式求:多边形在 yz、xz、xy 三个平面上的投影面积分别作为法线的 x、y、z 分量。投影后仍可能自相交,需要更昂贵的方法。

三角化算法

方法复杂度说明
暴力分割O(n3)O(n^3)检查任意两点连线是否与多边形边相交,不相交就用它分成两半递归
耳切法 (ear clipping)O(n2)O(n^2)检查顶点 i,i+1,i+2i,i+1,i+2 构成的三角形,若线段 (i,i+2)(i,i+2) 不与任何边相交则 i+1i+1 是"耳";逐个切掉耳并复查相邻两个顶点
更复杂的方法O(nlog⁡n)O(n\log n),典型情况近 O(n)O(n)Schneider 与 Eberly 给出伪代码
凸剖分—比三角化更省存储与后续计算;凸多边形可直接表示为三角扇;星形凹多边形也可当扇处理
  • 多轮廓多边形(带洞):在环之间生成"桥接边"(keyhole / bridge edge) 合并为单一轮廓,也可逆向恢复。
  • 写出稳健通用的三角化器很难(病态情况、精度问题)。模板缓冲法绕开三角化:把多边形当三角扇画进模板缓冲并用反转模式,被画奇数次的区域是填充区,凹处和洞被画偶数次;第二遍用模板只绘制填充区。可处理多轮廓,但每个多边形两遍、每帧清模板、不能直接用深度缓冲,适合显示用户即时绘制的复杂选区。

四边形分割与着色问题(16.2.1 节)

  • 凹四边形只有一种分法;否则要选对角线,原则是让新边两端的差异最小:平面四边形无额外数据时选较短对角线;带逐顶点烘焙颜色时选颜色差较小的对角线。
  • 纹理扭曲:三角形只有三个纹理坐标,只能建立仿射变换(剪切),不能表达扭曲;对扭曲四边形,两种对角线和不三角化的水平插值都不能体现设计意图(旋转后外观还会变)。解决办法:预先扭曲纹理并重设坐标;细分网格(只能缓解);投影纹理即时扭曲(纹理间距不均);双线性映射(需额外逐顶点数据)。这在几乎所有曲面上都会某种程度出现。
  • 圆锥尖端:多个三角形在尖端有不同法线且不共享,产生着色不连续。

边缘裂缝与 T 型顶点(16.2.2 节)

  • 边缘裂缝:样条曲面分别沿曲线步进细分时,共享边上生成的点不一致,能透过缝看到后面,或因插值不同露出接缝。修复称为边缘缝合,确保共享边上的顶点被两个曲面共用(自适应细分见第 17 章)。
  • T 型顶点:两模型边相接但不共享全部顶点。精度不足会出现裂缝(现代硬件用子像素寻址缓解);更明显的是着色伪影。修复:找到这些边并与相邻面共享顶点。简单扇形三角化可能生成零面积退化三角形,重新三角化通常更好,因为细长三角形易引发其他着色问题;Cignoni 等给出已知 T 顶点位置时避免退化三角形的 O(n)O(n) 算法。
  1. realtime_rendering_4ed.pdf 第 16 章 Polygonal Techniques

相关页面

图形学网格整合与顶点法线Mesh Consolidation & Vertex Normals整合 (consolidation) 指把零散多边形合并成共享顶点的网格、让所有面朝向一致、判断是否为实体,并生成平滑的顶点法线与折痕边。这些步骤是背面剔除、折痕检测、阴影体、碰撞检测、3D 打印等的前提。图形学三角形带、扇与索引网格Triangle Strips, Fans & Indexed Meshes让共享顶点的三角形成组送入管线,可以减少顶点着色器调用。三角形扇和带把每三角形发送的顶点数降到接近 1;现代 GPU 的标准做法是带单一索引缓冲的三角形网格,理论上每三角形只需处理约 0.5 个顶点,实际效果取决于变换后顶点缓存,由三角形顺序优化(Forsyth、Tipsify 等)决定。图形学网格简化Mesh Simplification网格简化(数据缩减、抽取 decimation)在尽量保持外观的前提下减少三角形数,使应用能在低端机器上伸缩。核心操作是可逆的边折叠,用代价函数(典型是 Garland–Heckbert 的二次误差度量 QEM)排序;它产生的渐进网格可用于连续 LOD 与渐进传输,但自动化并非万能。图形学顶点压缩与精度Vertex Compression & Precision网格数据像纹理一样可以压缩:传输用的整体压缩(Draco 等)一次性解码,渲染用的定长压缩让顶点着色器在 GPU 上逐顶点解码,从而降低内存、带宽并改善缓存。另一面是精度问题:大世界中单一坐标系会让远离原点的物体抖动,需要相对相机的变换或分段原点。图形学合并阶段与帧缓冲Merging & Framebuffer合并阶段把像素着色算出的片元颜色和缓冲区里已有的颜色结合起来,同时负责深度测试、模板测试和混合。它通常不可编程但高度可配置,也叫 ROP(光栅操作或渲染输出单元)。帧缓冲是系统中所有缓冲区的总称。图形学光栅化Rasterization光栅化(也叫扫描转换)把屏幕空间里带深度和着色数据的顶点,转换成三角形覆盖的像素(片元),交给像素处理阶段。它是几何处理和像素处理之间的同步点:三个顶点在这里组成三角形。图形学曲面细分与几何着色器Tessellation & Geometry Shader曲面细分、几何着色器和流输出是顶点着色器之后的三个可选阶段。曲面细分把曲面描述按需生成合适数量的三角形;几何着色器能把图元变成别的图元,但效率不好、实际用得少;流输出把处理后的顶点写回内存以便复用。图形学高效曲面细分Efficient Tessellation实时渲染曲面需要把它细分成三角网格。与其在 CPU 上细分后传大量三角形,不如把曲面描述送到 GPU,由硬件细分管线(外壳着色器 → 细分器 → 域着色器)展开。本页讲分数细分因子、按曲率/屏幕尺寸/轮廓决定细分率的自适应细分、避免裂缝与跳变的方法,以及 Catmull-Clark 曲面的快速 GPU 渲染(近似面片、OpenSubdiv 特征自适应细分、自适应四叉树)。图形学地形渲染Terrain Rendering地形渲染(游戏、Google Earth、开源大世界引擎 Cesium 等)要在巨大高度场上按距离分配细节,同时控制内存、绘制调用和 LOD 之间的裂缝与跳变。主流 GPU 友好方案有:类似纹理 clipmap 的几何 clipmap、按瓦片复用顶点缓冲只换索引缓冲的分块方案、基于四叉树和屏幕空间误差的 chunked LOD、预存所有过渡索引缓冲的受限四叉树,以及 GPU 细分和压缩等补充手段。任何方案都可叠加分形噪声以在拉近时提供细节,许多系统也在加载时程序化生成地形。游戏数学光线求交测试Ray Intersection Tests光线求交用于拾取、光线追踪、地面高度查询等。本页给出四类经典测试:光线-球(代数解与带早期拒绝的几何优化解)、光线-盒(平板法与光线斜率法)、光线-三角形(Möller-Trumbore,直接从顶点求重心坐标与距离)、光线-多边形(先求平面交点,再投影到二维做交叉数测试)。共同思路是先做便宜的拒绝测试、推迟除法与开方、必要时降维。游戏开发动画混合Animation Blending动画混合把两个或多个输入姿势合成一个输出姿势。基本工具是对每个关节的局部 SRT 分别做 lerp(旋转用 nlerp 或 slerp);在此之上有时间插值、交叉淡入淡出、方向移动、一维/二维混合空间、部分骨骼混合和叠加混合(差分片段)。前几种都是加权平均,叠加混合则是"加上一段变化"(GEA4 卷 II 13.6)。

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原