概念页
高效曲面细分
Efficient Tessellation
实时渲染曲面需要把它细分成三角网格。与其在 CPU 上细分后传大量三角形,不如把曲面描述送到 GPU,由硬件细分管线(外壳着色器 → 细分器 → 域着色器)展开。本页讲分数细分因子、按曲率/屏幕尺寸/轮廓决定细分率的自适应细分、避免裂缝与跳变的方法,以及 Catmull-Clark 曲面的快速 GPU 渲染(近似面片、OpenSubdiv 特征自适应细分、自适应四叉树)。
均匀细分与硬件管线(17.6 节)
最简单的是均匀细分:例如在贝塞尔面片每边取 11 个点,以 双重循环求值,每四个点生成两个三角形,共 个。
flowchart LR V["顶点着色器"] --> H["外壳着色器: 计算控制点与细分因子"] H --> T["细分器: 在 uv 域生成点并连成三角形"] T --> D["域着色器: 用控制点求每个 uv 的位置"] D --> G["几何着色器"]
上图是带硬件细分的管线(DirectX 命名,OpenGL 中称控制着色器和求值着色器),详见 曲面细分与几何着色器。
分数细分(17.6.1 节)
- Moreton 引入分数细分因子以获得更平滑的 LOD。四条边可以有独立因子(边的细分因子 = 该边生成的点数减一);内部取上下两边中较大者和左右两边中较大者,例如基本细分率 4×8,因子较小的边沿边缘补三角形。
- 整数因子 在 处生成 个点;分数因子 在 ()处生成 个点,最右点吸附到端点。这种模式不对称,相邻面片可能从另一端生成点而产生裂缝,Moreton 改用对称的点模式。三角形同样支持逐边独立的分数细分率,从而实现自适应细分(例如置换地形)。
自适应细分(17.6.2 节)
按曲率、边长或屏幕尺寸等度量调整细分率,避免在平坦或远处的区域生成多余三角形。
- 裂缝:两区域细分率不同时,一侧在边上求值的点另一侧没有。分数细分通常只用边本身的信息计算边因子(这是两个面片唯一共享的数据);但浮点误差仍可能造成裂缝,Nießner 等要求无论从 到 还是反向细分,同一条边返回完全相同的点,保证水密。
- 跳变 / 游动:某条边的因子逐帧变化太大会产生 popping 或 swimming,计算因子时要考虑。
- 平坦度判据:对边 ,求参数中点对应的曲面点 及其到直线 的投影 ,距离 足够小即认为平坦;S 形曲线可能被误判为平坦,可随机扰动采样参数;也可用相对量 ;三角形同理用中心点到三角形平面的距离。需设细分次数上限保证终止;分数细分可把 向量投影到屏幕,以其(缩放后)长度作为细分率。
- 其他因素:顶点邻域是否在视锥内(用包围边的球做视锥测试)、是否正面朝向( 处法线定义的三个平面都背向则不再细分)、屏幕覆盖是否大、是否靠近轮廓(某点法线与视线的点积接近 0 时继续细分,轮廓对感知质量最关键)。
- 屏幕空间边长估计:把线段平移到中点位于视线上并假设平行于近平面,投影长度 分子是线段长度,分母是眼睛 到线段中点沿视线 的距离。与阈值 比较时避免开方: 时继续细分。另一种做法是以边中心为球心、半边长为半径的球的投影作为因子(与面积成正比)。
- 置换细分的顶点因子 (Nießner & Loop), 为相机位置, 为顶点 的 条边, 为用户常数: 分别基于距离、相连四边形面积、最长边。边因子取两端顶点因子的最大值,内部因子取对边因子的最大值。Nießner 等建议角色使用单一全局因子 (依距离而定),细分次数为 。书中建议多试几种启发式及其组合。
Split and dice
Cook 等提出,目标是让每个三角形约一个像素以避免几何混叠;实时中阈值要提高到 GPU 能承受的程度。递归地把参数域四等分,直到估计均匀细分后的三角形达到目标大小,形成四叉树。适用于例如整片地形只是一个大面片、分数细分无法让近处更密远处更疏的情况。
- 相邻子方块层级差至多为 1(受限四叉树),再用补三角形的方法填裂缝;缺点是簿记更复杂。
- Liktor 等的 GPU 变体用分数分裂:分裂点从一侧平滑移到曲线或面片边的中心,原曲线替换为两段合起来等于原曲线的三次贝塞尔曲线,避免相机靠近时突然多分一次造成的游动和跳变;到达终止条件后剩下的子面片再用分数细分。
快速 Catmull-Clark 细分(17.6.3 节)
| 方法 | 思路 | 特点 |
|---|---|---|
| 近似面片 (Loop & Schaefer) | 每个四边形转为 4×4 控制点的双三次贝塞尔"几何面片"(用固定掩码从邻域顶点计算),域着色器中直接求值,无需邻居信息;含非规则顶点时用"非规则面片"近似,并加 u、v 两个切线面片求法线 | 全规则时精确,其他地方近似;含非规则顶点的边只有 ,不加切线面片会有明显着色伪影;Kovacs 等扩展到折痕和角点并实现于 Valve Source 引擎 |
| 特征自适应细分 FAS / OpenSubdiv(皮克斯开源) | 全规则四边形(各顶点度 4)等价于双三次 B 样条面片,直接用细分管线渲染;只在非规则面和折痕附近递归细分到最大层级 | CPU 预先建立细分所需顶点索引表(与顶点位置无关,所以基础网格可动画),连同网格一次性上传;每步细分用三个计算着色器依次算面点、边点、更新顶点;完整面片直接渲染,过渡面片拆成子面片以免裂缝,非规则顶点处用 Halstead 等方法求极限位置与法线;支持折痕、半光滑折痕、层次细节和自适应 LOD;DFAS 更快 |
| 自适应四叉树 (Brainerd 等) | 每个基础四边形只提交一个细分图元;预计算"细分计划"四叉树和控制点掩码列表,域着色器中按 迭代遍历四叉树到叶子,取 16 个控制点求值双三次 B 样条 | 书中称是迄今精确渲染 Catmull-Clark 曲面最快的方法,处理折痕等拓扑特征;提交图元与细分图元一一对应,细分更均匀;《使命召唤:高级战争》角色面部即采用 |
出处
- realtime_rendering_4ed.pdf 第 17 章 Curves and Curved Surfaces
相关页面
图形学曲面细分与几何着色器Tessellation & Geometry Shader曲面细分、几何着色器和流输出是顶点着色器之后的三个可选阶段。曲面细分把曲面描述按需生成合适数量的三角形;几何着色器能把图元变成别的图元,但效率不好、实际用得少;流输出把处理后的顶点写回内存以便复用。图形学细分曲线与细分曲面Subdivision Curves & Surfaces细分从一个控制多边形 / 控制网格出发,反复"细化 + 平滑",极限是光滑的曲线或曲面。它能从任意拓扑的网格得到连续、无裂缝的曲面,规则简单、天然支持无限 LOD,连接了离散三角网格与连续曲面。游戏和电影最常用的是 Catmull-Clark(四边形)和 Loop(三角形)两种逼近型方案,可扩展出折痕和置换细分。图形学PN 三角形与 Phong 细分PN Triangles & Phong Tessellation两种只用每个三角形自身的顶点位置和法线、把平面三角形替换成曲面三角形的方法,不需要邻接信息,适合硬件细分即时生成。PN 三角形构造三次贝塞尔三角形并二次插值法线;Phong 细分是"几何版 Phong 着色",生成二次曲面,更快更简单。两者都能明显改善低模的轮廓和着色。图形学参数曲面与贝塞尔面片Parametric Surfaces & Bézier Patches参数曲面把参数曲线从一个参数推广到两个参数 (u,v),由少量控制点定义,运行时细分成任意多个三角形,是质量与速度之间的天然权衡:三角形多则着色和轮廓更好。矩形定义域的是贝塞尔面片(张量积曲面),三角形定义域的是贝塞尔三角形,后者是 PN 三角形和 Phong 细分的基础。图形学计算着色器Compute Shader计算着色器是 DirectX 11 引入的一种 GPU 计算方式:它不固定在图形管线的某个位置,但由图形 API 调用,和其他着色器共用统一着色器核心。它暴露了线程组和组内共享内存,最大的优势是能直接处理 GPU 上生成的数据,不用来回传给 CPU。图形学多边形三角化Polygon Triangulation模型数据很少恰好是渲染需要的格式。图形 API 和硬件都针对三角形优化,所以复杂多边形要先剖分 (tessellation),最常见的是三角化 (triangulation)。本页讲三维数据的来源、三角化算法(耳切法、凸剖分、模板缓冲法)、四边形对角线选择与纹理扭曲,以及边缘裂缝和 T 型顶点。图形学细节层次Level of Detail细节层次 (LOD) 在物体对图像贡献变小时改用更简单的表示。LOD 系统由三部分组成:生成(简化或手工制作多个版本)、选择(按距离、投影面积等收益函数挑选)、切换(尽量减少跳变 popping)。LOD 主要减少顶点处理,也通过减少 quad 过度着色降低像素开销;进一步还可在预算约束下全局选择 LOD,实现时间关键(恒定帧率)渲染。图形学地形渲染Terrain Rendering地形渲染(游戏、Google Earth、开源大世界引擎 Cesium 等)要在巨大高度场上按距离分配细节,同时控制内存、绘制调用和 LOD 之间的裂缝与跳变。主流 GPU 友好方案有:类似纹理 clipmap 的几何 clipmap、按瓦片复用顶点缓冲只换索引缓冲的分块方案、基于四叉树和屏幕空间误差的 chunked LOD、预存所有过渡索引缓冲的受限四叉树,以及 GPU 细分和压缩等补充手段。任何方案都可叠加分形噪声以在拉近时提供细节,许多系统也在加载时程序化生成地形。图形学对象空间与纹理空间着色Object- & Texture-Space Shading对象空间/纹理空间着色把着色计算的频率与几何采样(光栅化)的频率解耦:在物体的参数化(纹理图表)上计算着色并存入纹理,最终光栅化时只查表。思想源自 Pixar 的 Reyes 离线渲染器的微多边形着色。它能消除 quad 过度着色、按屏幕覆盖率控制着色量、在帧间复用着色结果,甚至让着色以低于光栅化的帧率异步运行;代价是物体必须有唯一的 uv 图表、先着色后遮挡带来浪费等。