中EN
概念页

PN 三角形与 Phong 细分

PN Triangles & Phong Tessellation

两种只用每个三角形自身的顶点位置和法线、把平面三角形替换成曲面三角形的方法,不需要邻接信息,适合硬件细分即时生成。PN 三角形构造三次贝塞尔三角形并二次插值法线;Phong 细分是"几何版 Phong 着色",生成二次曲面,更快更简单。两者都能明显改善低模的轮廓和着色。

PN 三角形(17.2.4 节)

Vlachos 等提出,"PN" 即点 (point) 与法线 (normal),也称 N-patch,基于 van Overveld 与 Wyvill 的工作。输入三角形顶点 p300,p030,p003\mathbf{p}_{300},\mathbf{p}_{030},\mathbf{p}_{003} 和法线 n200,n020,n002\mathbf{n}_{200},\mathbf{n}_{020},\mathbf{n}_{002},w=1−u−vw=1-u-v,构造三次贝塞尔三角形: p(u,v)=u3p300+v3p030+w3p003+3u2vp210+3u2wp201+3uv2p120+3v2wp021+3vw2p012+3uw2p102+6uvwp111\mathbf{p}(u,v)=u^3\mathbf{p}_{300}+v^3\mathbf{p}_{030}+w^3\mathbf{p}_{003}+3u^2v\mathbf{p}_{210}+3u^2w\mathbf{p}_{201}+3uv^2\mathbf{p}_{120}+3v^2w\mathbf{p}_{021}+3vw^2\mathbf{p}_{012}+3uw^2\mathbf{p}_{102}+6uvw\mathbf{p}_{111}

  • 边控制点:把 23p300+13p030\tfrac23\mathbf{p}_{300}+\tfrac13\mathbf{p}_{030} 沿 n200\mathbf{n}_{200} 投影到由 p300\mathbf{p}_{300}、n200\mathbf{n}_{200} 定义的切平面(法线已归一化): p210=13(2p300+p030−(n200⋅(p030−p300))n200)\mathbf{p}_{210}=\frac13\Big(2\mathbf{p}_{300}+\mathbf{p}_{030}-\big(\mathbf{n}_{200}\cdot(\mathbf{p}_{030}-\mathbf{p}_{300})\big)\mathbf{n}_{200}\Big) 边控制点只依赖边两端的点和法线,相邻三角形共享法线时即保证 C0C^0。
  • 内部控制点: p111=14(p210+p120+p102+p201+p021+p012)−16(p300+p030+p003)\mathbf{p}_{111}=\frac14(\mathbf{p}_{210}+\mathbf{p}_{120}+\mathbf{p}_{102}+\mathbf{p}_{201}+\mathbf{p}_{021}+\mathbf{p}_{012})-\frac16(\mathbf{p}_{300}+\mathbf{p}_{030}+\mathbf{p}_{003})
  • 法线二次插值(而不是从曲面求导): n(u,v)=u2n200+v2n020+w2n002+2(uv n110+uw n101+vw n011)\mathbf{n}(u,v)=u^2\mathbf{n}_{200}+v^2\mathbf{n}_{020}+w^2\mathbf{n}_{002}+2(uv\,\mathbf{n}_{110}+uw\,\mathbf{n}_{101}+vw\,\mathbf{n}_{011}) 线性插值法线无法表达拐点(凸面没问题,S 形会出错),所以用二次。n110\mathbf{n}_{110} 不能简单取两端法线平均(两端法线相同时问题重现),而是把平均法线在法线平行于 p030−p300\mathbf{p}_{030}-\mathbf{p}_{300} 的平面 π\pi 中反射: n110′=n200+n020−2(p030−p300)⋅(n200+n020)(p030−p300)⋅(p030−p300)(p030−p300)\mathbf{n}'_{110}=\mathbf{n}_{200}+\mathbf{n}_{020}-2\frac{(\mathbf{p}_{030}-\mathbf{p}_{300})\cdot(\mathbf{n}_{200}+\mathbf{n}_{020})}{(\mathbf{p}_{030}-\mathbf{p}_{300})\cdot(\mathbf{p}_{030}-\mathbf{p}_{300})}(\mathbf{p}_{030}-\mathbf{p}_{300}) 再归一化。van Overveld 与 Wyvill 原本用 3/2 而非 2,用 2 恰好是真正的平面反射。
  • LOD:原始数据为 LOD 0,LOD nn 在每条边插入 nn 个新顶点,生成 (n+1)2(n+1)^2 个子三角形。

PN 三角形的坑

  • 为避免裂缝,所有三角形必须用相同 LOD,小三角形和大三角形细分得一样多;可用分数细分和自适应细分解决(见 高效曲面细分)。
  • 折痕难控制,常需在折痕附近插入额外三角形;Boubekeur 等允许顶点有两条法线,两个这样的相连顶点形成折痕。
  • 三角形之间只有 C0C^0,但法线连续,看起来近似 G1G^1,多数情况可接受;但良好纹理需要 C1C^1。相邻三角形法线不共享会出现裂缝。改进:Grün 提高连续性;PNG1 三角形处处 G1G^1;McDonald 与 Kilgard 支持相邻三角形法线不同;Dyken 等只对视点下的轮廓自适应细分。

Phong 细分(17.2.5 节)

Boubekeur 与 Alexa 提出。基础三角形上的点 p(u,v)=(u,v,1−u−v)⋅(p0,p1,p2)\mathbf{p}(u,v)=(u,v,1-u-v)\cdot(\mathbf{p}_0,\mathbf{p}_1,\mathbf{p}_2)。先定义把点 q\mathbf{q} 投影到顶点 ii 切平面的函数 ti(q)=q−((q−pi)⋅ni)ni\mathbf{t}_i(\mathbf{q})=\mathbf{q}-\big((\mathbf{q}-\mathbf{p}_i)\cdot\mathbf{n}_i\big)\mathbf{n}_i 用它们代替顶点做线性插值,再用形状因子 α\alpha 与基础三角形混合: p∗(u,v)=(u,v,1−u−v)⋅(t0(p),t1(p),t2(p)),pα∗=(1−α)p+αp∗\mathbf{p}^*(u,v)=(u,v,1-u-v)\cdot\big(\mathbf{t}_0(\mathbf{p}),\mathbf{t}_1(\mathbf{p}),\mathbf{t}_2(\mathbf{p})\big),\qquad \mathbf{p}^*_\alpha=(1-\alpha)\mathbf{p}+\alpha\mathbf{p}^* 推荐 α=0.75\alpha=0.75。生成的是二次三角面片(次数低于 PN 三角形),法线像 Phong 着色那样线性插值。

对比

PN 三角形Phong 细分
曲面次数三次贝塞尔三角形二次
法线二次插值,需构造 n110\mathbf{n}_{110} 等线性插值
输入顶点位置 + 法线顶点位置 + 法线 + 用户 α\alpha
代价较高更快、更易实现
共同点无需邻接信息,可由细分硬件即时生成,改善轮廓与着色同左
  1. 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 打印等的前提。

输入关键词开始搜索

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