概念页
PN 三角形与 Phong 细分
PN Triangles & Phong Tessellation
两种只用每个三角形自身的顶点位置和法线、把平面三角形替换成曲面三角形的方法,不需要邻接信息,适合硬件细分即时生成。PN 三角形构造三次贝塞尔三角形并二次插值法线;Phong 细分是"几何版 Phong 着色",生成二次曲面,更快更简单。两者都能明显改善低模的轮廓和着色。
PN 三角形(17.2.4 节)
Vlachos 等提出,"PN" 即点 (point) 与法线 (normal),也称 N-patch,基于 van Overveld 与 Wyvill 的工作。输入三角形顶点 和法线 ,,构造三次贝塞尔三角形:
- 边控制点:把 沿 投影到由 、 定义的切平面(法线已归一化): 边控制点只依赖边两端的点和法线,相邻三角形共享法线时即保证 。
- 内部控制点:
- 法线二次插值(而不是从曲面求导): 线性插值法线无法表达拐点(凸面没问题,S 形会出错),所以用二次。 不能简单取两端法线平均(两端法线相同时问题重现),而是把平均法线在法线平行于 的平面 中反射: 再归一化。van Overveld 与 Wyvill 原本用 3/2 而非 2,用 2 恰好是真正的平面反射。
- LOD:原始数据为 LOD 0,LOD 在每条边插入 个新顶点,生成 个子三角形。
PN 三角形的坑
- 为避免裂缝,所有三角形必须用相同 LOD,小三角形和大三角形细分得一样多;可用分数细分和自适应细分解决(见 高效曲面细分)。
- 折痕难控制,常需在折痕附近插入额外三角形;Boubekeur 等允许顶点有两条法线,两个这样的相连顶点形成折痕。
- 三角形之间只有 ,但法线连续,看起来近似 ,多数情况可接受;但良好纹理需要 。相邻三角形法线不共享会出现裂缝。改进:Grün 提高连续性;PNG1 三角形处处 ;McDonald 与 Kilgard 支持相邻三角形法线不同;Dyken 等只对视点下的轮廓自适应细分。
Phong 细分(17.2.5 节)
Boubekeur 与 Alexa 提出。基础三角形上的点 。先定义把点 投影到顶点 切平面的函数 用它们代替顶点做线性插值,再用形状因子 与基础三角形混合: 推荐 。生成的是二次三角面片(次数低于 PN 三角形),法线像 Phong 着色那样线性插值。
对比
| PN 三角形 | Phong 细分 | |
|---|---|---|
| 曲面次数 | 三次贝塞尔三角形 | 二次 |
| 法线 | 二次插值,需构造 等 | 线性插值 |
| 输入 | 顶点位置 + 法线 | 顶点位置 + 法线 + 用户 |
| 代价 | 较高 | 更快、更易实现 |
| 共同点 | 无需邻接信息,可由细分硬件即时生成,改善轮廓与着色 | 同左 |
出处
- realtime_rendering_4ed.pdf 第 17 章 Curves and Curved Surfaces
相关页面
图形学参数曲面与贝塞尔面片Parametric Surfaces & Bézier Patches参数曲面把参数曲线从一个参数推广到两个参数 (u,v),由少量控制点定义,运行时细分成任意多个三角形,是质量与速度之间的天然权衡:三角形多则着色和轮廓更好。矩形定义域的是贝塞尔面片(张量积曲面),三角形定义域的是贝塞尔三角形,后者是 PN 三角形和 Phong 细分的基础。图形学高效曲面细分Efficient Tessellation实时渲染曲面需要把它细分成三角网格。与其在 CPU 上细分后传大量三角形,不如把曲面描述送到 GPU,由硬件细分管线(外壳着色器 → 细分器 → 域着色器)展开。本页讲分数细分因子、按曲率/屏幕尺寸/轮廓决定细分率的自适应细分、避免裂缝与跳变的方法,以及 Catmull-Clark 曲面的快速 GPU 渲染(近似面片、OpenSubdiv 特征自适应细分、自适应四叉树)。图形学曲面细分与几何着色器Tessellation & Geometry Shader曲面细分、几何着色器和流输出是顶点着色器之后的三个可选阶段。曲面细分把曲面描述按需生成合适数量的三角形;几何着色器能把图元变成别的图元,但效率不好、实际用得少;流输出把处理后的顶点写回内存以便复用。图形学着色频率与材质系统Shading Frequency & Material Systems实现着色时要按"计算频率"划分工作:整个 draw call 不变的放到应用端作为 uniform,其余放在相应的可编程阶段。实践中大多数着色在像素级完成,顶点着色器负责变换和变形。材质系统把面向美术的材质与底层着色器组织起来,处理海量着色器变体的组合问题。图形学网格整合与顶点法线Mesh Consolidation & Vertex Normals整合 (consolidation) 指把零散多边形合并成共享顶点的网格、让所有面朝向一致、判断是否为实体,并生成平滑的顶点法线与折痕边。这些步骤是背面剔除、折痕检测、阴影体、碰撞检测、3D 打印等的前提。