0%

Tessellation 曲面细分阶段

Tessellation 曲面细分阶段

Tessellation 总览

曲面细分(Tessellation), 在计算机图形学中的含义是从任意网格创建光滑曲面1。该阶段分别于DirectX 11和OpenGL 4.0, OpenGL ES 3.2 首次出现2。(注:对应于SM5.03)如下图所示。

来源于论文M. Nießner & B. Keinert & M. Fisher & M. Stamminger & C. Loop & H. Schäfer / Survey on Hardware Tessellation, Page 4

上图靠左边的是输入Tessellation的原始网格(mesh)数据。靠右边是Tessellation之后的结果。可以看到,通过Tessellation阶段的处理,可以生成比原来光滑的多的曲面。

由此看来,Tessellation的好处2有:

  1. 因为Tessellation是在GPU完成的, 这就意味着CPU能够发送较小数据规模的原始网格数据,从而能够减少CPU-GPU的总线通行量,避免由于CPU-GPU总线通信带来的瓶颈问题。
  2. 能够实现LOD(Level-Of-Detail)。LOD的意思是最终呈现的曲面的精细度能够用摄像机到物体的距离来控制。因为如果物体距离摄像机过远的话,就没必要渲染太过精细的曲面以节省GPU的性能开销。

Tessellation 的组成

Tessellation阶段由3个子阶段组成。这三个用DirectX的术语来讲分别是:

Hull Shader, Tessellator, Domain Shader.

这三个阶段如下图所示。

来源于书籍Real-Time Rendering, Page 44

其中hull shader和domain shader是可编程的shader,而Tessellator是固定功能的硬件单元2。这些阶段在GPU Pipeline的位置如下图所示:

diagram of the direct3d 11 pipeline that highlights the hull-shader, tessellator, and domain-shader stages, From Microsoft Docs

Hull Shader

Hull Shader 在 OpenGL 里被称为 Tesselation Control Shader4,GPU以图元为单位调用Hull Shader。

Hull Shader需要完成好两件事情:

  1. 通知Tessellator,有多少顶点数据待处理,以及数据的配置如何。
  2. 处理每一个顶点(控制点)。

当然,Hull Shader阶段还可以依据需要增删输入的顶点数据。

Factors

Tessellation Factors,或对应于上图简称为TF,是由Hull Shader产生的用于控制曲面细分的参数。(OpenGL 里称之为 Tessellation Levels5)

TF 分为两种类型,分别为Inner Factor和Outer Factor。其中Inner Factor用来控制在每一个三角形或四边形内要被细分出多少个顶点,Outer Factor用来控制每个图元的边缘被切割细分的程度。

见下图,Factors能够控制曲面细分的程度。

来源于书籍Real-Time Rendering, Page 45

图中从左到右Factor参数分别设置为1,2,4,8.

Hull Shader的输出是处理后的图元。但是,Hull Shader也可以通过输出小于0的或NaN值来指示后续阶段丢弃此图元6

Tessellator

Tessellator 是GPU硬件一个固定功能的阶段。该阶段执行实际的“曲面细分”过程,也即,将较大的图元细分为更多更小的图元。

该阶段的输入是Hull Shader产生的图元(Tessellator以Hull Shader产生的图元为单位运行),输出是UV坐标及曲面拓扑信息。这些信息将会传递到Domain Shader做进一步处理。

Domain Shader

Domain Shader的输入是来源于Hull Shader产生的控制点和Tessellator产生的UV坐标及曲面拓扑信息。该阶段计算细分后的顶点位置。Domain Shader是以Tesselator输出的顶点为单位运行的。

Diagram of the domain-shader stage, 来源自Microsoft Docs

参考