中EN
概念页

曲面细分与几何着色器

Tessellation & Geometry Shader

更新于 2026-10-15 约 8 分钟GPU着色器几何LOD

曲面细分、几何着色器和流输出是顶点着色器之后的三个可选阶段。曲面细分把曲面描述按需生成合适数量的三角形;几何着色器能把图元变成别的图元,但效率不好、实际用得少;流输出把处理后的顶点写回内存以便复用。

曲面细分 (Tessellation)

DirectX 11 引入,OpenGL 4.0 和 OpenGL ES 3.2 也支持。

好处

  • 曲面描述比对应的三角形更紧凑,省内存;
  • 每帧都在变形的角色或物体,不会让 CPU 到 GPU 的总线成为瓶颈;
  • 按视角控制细节:球离得远只要几个三角形,离得近可以有几千个;也能在弱 GPU 上用更低质量来保帧率。

三个组成部分

下图是曲面细分的数据流:外壳着色器决定怎么细分并处理控制点,固定功能的细分器生成新顶点,域着色器算出每个顶点的最终数据。

flowchart LR
    P["输入面片<br/>控制点"] --> H["外壳着色器<br/>Hull Shader"]
    H -->|"细分因子和类型"| T["细分器<br/>Tessellator,固定功能"]
    H -->|"变换后的控制点、细分因子、常量"| D["域着色器<br/>Domain Shader"]
    T -->|"生成的顶点和重心坐标"| D
    D --> O["输出三角网格"]
DirectX 叫法OpenGL 叫法作用
外壳着色器 (Hull Shader)细分控制着色器告诉细分器生成多少三角形、怎么排布;处理每个控制点,也可以增删控制点
细分器 (Tessellator)图元生成器固定功能,生成新顶点并给出重心坐标;支持三角形、四边形、等值线(等值线有时用于头发)
域着色器 (Domain Shader)细分求值着色器用重心坐标代入面片的求值方程,算出位置、法线、纹理坐标等

细分因子分内部和外部两种:内部因子决定三角形或四边形内部细分多少,外部因子决定每条外边分成几段。分开控制可以让相邻面片的边细分一致,避免接缝处出现裂缝。外部因子为 0 或 NaN 时,这个面片会被丢弃。

外壳着色器常根据面片的距离或屏幕大小实时计算细分因子,比如地形渲染。数据放大这一步放在固定功能的细分器里,而不是着色器里,是为了计算效率。

几何着色器 (Geometry Shader)

DirectX 10 引入,位于曲面细分之后,可选。

  • 输入:一个图元及其顶点,可以是点、线段、三角形,也可以带相邻顶点。
  • 输出:零个或多个顶点,作为点、折线或三角形带。可以修改、添加或删除图元。
  • 曲面细分做不到、它能做的:把图元变成另一种图元,比如把三角形变成线框,或把线变成面向相机的四边形来画粗线框。
  • 常见用途:一次生成六份变换后的数据来渲染立方体贴图的六个面、生成级联阴影贴图、从点生成大小不一的粒子、沿轮廓挤出毛发鳍片、为阴影算法查找物体边缘。
  • DirectX 11 起支持几何着色器实例化,最多可以输出四个流。

为什么实际用得少

  • 必须按输入顺序输出结果,多个核心并行时要保存并排序,影响性能;
  • 完全可编程,资源和内存需求最难预测;
  • 不符合 GPU 的长处,在一些移动设备上甚至是软件实现,RTR4 明确说那里不建议使用。

draw call 之后,GPU 上只有三个地方能"创造"工作量:光栅化、曲面细分、几何着色器。

流输出 (Stream Output)

Shader Model 4.0 引入,OpenGL 里叫 transform feedback。

  • 顶点经过顶点着色器(以及可选的曲面细分和几何着色器)后,除了继续送去光栅化,还可以输出成一个有序数组;光栅化甚至可以完全关掉,把管线当作纯粹的流处理器。
  • 数据可以再送回管线,实现迭代处理,适合模拟水流和粒子,也可以把蒙皮后的顶点存下来复用。
  • 代价:只能输出浮点数,内存开销明显;按图元输出,网格里的顶点共享会丢失,所以通常只把顶点当作点集送进去。

取舍

  • 需要按距离控制细节时,曲面细分比在 CPU 上做 LOD 更灵活,但也有开销;RTR4 提到也有研究认为计算着色器可以比外壳着色器更高效(见 计算着色器)。
  • 几何着色器能做的事,在性能敏感的场景下通常有更好的替代方案。

GEA 的视角:细分器、几何着色器与流输出(卷 II 11.4.6.1)

外壳/域着色器与细分器

  • 可选的细分阶段由两个可编程子阶段(外壳着色器、域着色器)和一个固定功能细分器组成,用低细节输入生成高细节三角网格,称为几何放大 (geometry amplification)。
  • 外壳着色器的输入是面片 (patch/hull),例如贝塞尔样条的控制点,输出一个或多个新面片(订正:D3D11 中外壳着色器对每个输入面片输出一个面片——1 到 32 个输出控制点,外加由补丁常量函数算出的细分因子;见 MS Learn "Tessellation Stages");细分器把它们拆成四边形或三角形网格(称为 domain),坐标归一化到 0 到 1;域着色器算出最终顶点位置。
  • 细分阶段在顶点着色器之后,所以启用它时顶点着色器处理的其实是面片控制点而不是三角形顶点。
  • 主要好处:从很小的顶点缓冲生成大量顶点,可节省大量内存带宽;用途从连续或视角相关的动态 LOD 到细分曲面渲染(见 细分曲线与细分曲面、高效曲面细分)。

几何着色器为什么慢

GEA 把几何着色器称为"较老的技术",列出用途:阴影体挤出、一次渲染立方体贴图六个面、沿轮廓边挤出毛发鳍片、从点生成粒子四边形、闪电的分形细分、布料模拟等。但它天生难以高效实现:

  1. 图元装配要做两次:一次为几何着色器准备输入,一次处理它(可能放大后)的输出。
  2. 必须按输入顺序输出:逻辑管线要求保持应用的排序(合成和 alpha 混合需要),GPU 不能重排输出,丢掉了潜在的性能。
  3. 严格的顺序通常迫使输出先写内存再读回,容易因缓存未命中而停顿。

这与本页「取舍」一节的结论一致。

流输出

  • 位于几何着色器和光栅化器之间,把收到的顶点持续写进一个或多个输出缓冲,相当于生成新的顶点缓冲;结果可在当前 draw call 中回送输入装配器,也可留给应用或下一个渲染 pass。

    原书问题(11.4.6.1):流输出的数据不能在同一个 draw call 中回送输入装配器;只能在之后的 draw call 中把输出缓冲作为顶点缓冲再次输入,D3D 为此提供了无需 CPU 知道顶点数的 DrawAuto(MS Learn "Stream-Output Stage":"stream-output data can be... recirculated back into the pipeline in a subsequent rendering pass";ID3D11DeviceContext::DrawAuto)。GEA 的毛发例子也只能这样分两次 draw 完成。

  • 限制:不能输出带索引的图元,三角形按每个三顶点写出,共享顶点必然重复;邻接信息不会写出。
  • GEA 的例子是毛发:以前 CPU 做发丝样条的物理模拟和细分、GPU 只画线段;有了流输出,顶点着色器在样条控制点上做物理,几何着色器细分样条,再经流输出送回管线顶端渲染,全程不需要 CPU(见 毛发渲染)。
  • 在新硬件上,这三个阶段的工作都可以由网格着色器和放大着色器承担,见 网格着色器管线。

GPU Gems 的视角:通用自适应网格细化 GAMeR(GPU Gems 3 第 5 章)

来源:Boubekeur & Schlick《Generic Adaptive Mesh Refinement》;摘录 Chapter 5. Generic Adaptive Mesh Refinement — Boubekeur & Schlick。

单遍顶点程序:按需局部细化级别,从 GPU 内存中预细分的重心坐标图案里挑一块,替换每个粗三角,再按位移函数(用户给定或数据驱动)摆顶点;任意拓扑。应用:高阶 Bézier 光滑、程序位移、自由变形、保证轮廓一致的位移贴图、多级地形等。可视为硬件 Tessellation / PN 三角形与 Phong 细分 普及前的「可编程细化」思路。

  1. realtime_rendering_4ed.pdf 第 3 章 The Graphics Processing Unit
  2. Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
  3. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 11 章 11.4.6.1 节
  4. Chapter 5. Generic Adaptive Mesh Refinement — Boubekeur & Schlick
  5. developer.nvidia.com/gpugems/gpugems3/part-i-geometry/chapter-5-generic-adaptive-mesh-refinement

相关页面

图形学可编程着色器与 GPU 管线Programmable Shaders & GPU PipelineGPU 把第 2 章的概念管线实现为一组硬件阶段,分为完全可编程、可配置但不可编程、完全固定三类。现代 GPU 采用统一着色器架构:各类着色器共用同一套编程模型和核心,由 GPU 自行分配负载。着色器用 HLSL、GLSL 等类 C 语言编写,输入分为 uniform 和 varying 两类。图形学顶点着色器Vertex Shader顶点着色器是程序员直接控制的第一个管线阶段,逐个处理输入顶点,至少要输出顶点在齐次裁剪空间里的位置。它不能创建或删除顶点,顶点之间也不能传递结果,正因如此可以大规模并行。图形学计算着色器Compute Shader计算着色器是 DirectX 11 引入的一种 GPU 计算方式:它不固定在图形管线的某个位置,但由图形 API 调用,和其他着色器共用统一着色器核心。它暴露了线程组和组内共享内存,最大的优势是能直接处理 GPU 上生成的数据,不用来回传给 CPU。图形学高效曲面细分Efficient Tessellation实时渲染曲面需要把它细分成三角网格。与其在 CPU 上细分后传大量三角形,不如把曲面描述送到 GPU,由硬件细分管线(外壳着色器 → 细分器 → 域着色器)展开。本页讲分数细分因子、按曲率/屏幕尺寸/轮廓决定细分率的自适应细分、避免裂缝与跳变的方法,以及 Catmull-Clark 曲面的快速 GPU 渲染(近似面片、OpenSubdiv 特征自适应细分、自适应四叉树)。图形学细分曲线与细分曲面Subdivision Curves & Surfaces细分从一个控制多边形 / 控制网格出发,反复"细化 + 平滑",极限是光滑的曲线或曲面。它能从任意拓扑的网格得到连续、无裂缝的曲面,规则简单、天然支持无限 LOD,连接了离散三角网格与连续曲面。游戏和电影最常用的是 Catmull-Clark(四边形)和 Loop(三角形)两种逼近型方案,可扩展出折痕和置换细分。图形学PN 三角形与 Phong 细分PN Triangles & Phong Tessellation两种只用每个三角形自身的顶点位置和法线、把平面三角形替换成曲面三角形的方法,不需要邻接信息,适合硬件细分即时生成。PN 三角形构造三次贝塞尔三角形并二次插值法线;Phong 细分是"几何版 Phong 着色",生成二次曲面,更快更简单。两者都能明显改善低模的轮廓和着色。图形学多边形三角化Polygon Triangulation模型数据很少恰好是渲染需要的格式。图形 API 和硬件都针对三角形优化,所以复杂多边形要先剖分 (tessellation),最常见的是三角化 (triangulation)。本页讲三维数据的来源、三角化算法(耳切法、凸剖分、模板缓冲法)、四边形对角线选择与纹理扭曲,以及边缘裂缝和 T 型顶点。图形学VR 立体渲染优化VR Stereo Rendering OptimizationVR 每帧要为两只眼渲染,并经合成器做镜头畸变与色差校正。本页讲厂商 SDK/API 的帧流程与内建优化(分层合成、隐藏区域网格、裁剪过的畸变网格),立体渲染如何避免工作量翻倍(合并视锥剔除、实例化、多视图扩展、多 GPU 广播、远景单目渲染),以及利用光学和人眼特性减少外围像素着色的技术:多分辨率着色、镜头匹配着色、径向密度遮罩、固定注视点渲染与注视点渲染。图形学GPU 架构案例GPU Architecture Case StudiesRTR4 第 23.10 节剖析三种架构:面向移动设备、以能效为先的 sort-middle 分块架构 ARM Mali G71 Bifrost;NVIDIA Pascal(GTX 1080)的 SM/TPC/GPC 层级与介于 sort-middle 和 sort-last fragment 之间的 tiled caching;AMD GCN Vega 的计算单元、异步计算引擎、DSBR 与 HBCC。硬件厂商通过对尚未制造的 GPU 做大量参数化仿真来决定 MP 数量、缓存、光栅引擎、ROP 数等——各种单元数量的原因归根结底是"这样效果最好"。图形学隐式曲面与有符号距离函数Implicit Surfaces & Signed Distance Functions隐式曲面用 f(\mathbf{p})=0 定义:代入点结果为零即在曲面上。返回到最近表面有符号距离的 f 称为有符号距离函数 (SDF)。它们便于做光线求交、构造实体几何 (CSG)、混合与变形,通常用光线步进可视化,也可用移动立方体等方法转为三角形。图形学轮廓边与几何描边Contour Edges & Geometric Outlining卡通渲染的黑色描边可以按表面着色、过程几何、图像处理、几何边检测或混合方式生成。本页讲边的分类,以及在几何层面生成描边的三类方法:基于着色法线、背面过程几何(偏移、膨胀、外壳)、显式检测轮廓边并做隐藏线消除。图像空间方法见 图像空间边缘检测。图形学粒子系统Particle Systems粒子系统是一组按某种算法运动的小物体,用于火、烟、爆炸、水流、星系等,同时负责动画(生成、移动、变化、删除)和渲染。粒子通常渲染成公告板;难点在半透明排序、光照(逐顶点、逐像素低分辨率光照图块)以及接收/投射/自阴影(透射率溅射、傅里叶不透明度贴图、消光体积)(RTR4 13.8 节)。图形学线框与线条渲染Wireframe & Line Rendering实心"硬"线条看似简单,却在 CAD、选中高亮、技术插图中很重要。难点在于:线与三角形位于同一位置时如何保证线在前面;如何隐藏或淡化被遮挡的线;线交叉时如何用光晕表现前后关系。图形学三角形带、扇与索引网格Triangle Strips, Fans & Indexed Meshes让共享顶点的三角形成组送入管线,可以减少顶点着色器调用。三角形扇和带把每三角形发送的顶点数降到接近 1;现代 GPU 的标准做法是带单一索引缓冲的三角形网格,理论上每三角形只需处理约 0.5 个顶点,实际效果取决于变换后顶点缓存,由三角形顺序优化(Forsyth、Tipsify 等)决定。图形学毛发渲染Hair & Fur Rendering毛发由角质层、皮质、髓质三层构成,可看作用曲线离散化的体积。几何上用沿引导曲线挤出的四边形条带并配合 alpha/顺序无关透明;着色用 BSDF(R、TT、TRT 分量),再加体积自阴影与多次散射近似;动物短毛可用壳与鳍或几何着色器挤出(RTR4 14.7 节)。图形学网格着色器管线Mesh Shader Pipeline网格着色器管线(也叫网格几何管线)是 GPU 厂商为取代传统光栅管线前段而推出的新架构:光栅化器和像素着色器不变,网格着色器和可选的放大着色器(任务着色器)接管顶点、外壳、域和几何着色器的全部工作。它以类似计算着色器的线程组处理叫 meshlet 的小批图元,像启动计算着色器一样启动绘制,还能把部分应用层工作搬到 GPU 上。2019 年进入 DirectX 12,2022 年以 VKEXTmeshshader 扩展进入 Vulkan。图形学渲染管线Rendering Pipeline渲染管线是实时图形的核心:给定虚拟相机、三维物体、光源等,把场景转换成一张二维图像。RTR4 把它粗分为四个功能阶段:应用、几何处理、光栅化、像素处理,各阶段并行执行,整体速度由最慢的阶段决定。图形学视差贴图Parallax Mapping法线贴图的凹凸不会随视角移位,也不会互相遮挡。视差贴图用高度场按视角偏移纹理坐标,以几条额外指令换来明显提升;视差遮蔽贴图 (POM,又称浮雕贴图) 沿视线在高度场中步进求交,能表现遮挡和自阴影,但轮廓仍是原始平面。图形学渲染开发与 GPU 调试工具Rendering Development & GPU Debugging Tools渲染引擎的运行时部分只是拼图的一块,还需要一批离线工具来制作内容、优化性能、诊断问题。GEA 介绍了四类:数字内容创作 (DCC) 工具、材质编辑器、资产调理管线,以及 PIX、Razor GPU 这样的 GPU 帧捕获、检查和回放工具(GEA4 卷 II 12.9)。

被这些页面引用1 篇

输入关键词开始搜索

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