Direct X 12 – Tessellation Stage 镶嵌阶段

tessellation阶段指的是渲染管线中三个将几何体进行细分的阶段。简单来说,tessellation指的就是将几何体细分为更小的三角形并且以某种方式移动新生成的顶点。而增加三角形的数量就是为了增加网格模型的细节。但是,我们为什么不直接创建细节程度更高的网格模型呢?以下为我们使用tessellation的三个理由。

1. 在GPU端使用动态LOD(level of detail)。我们可以动态调整网格模型的细节程度,例如,基于模型到camera的距离或者其他因素等等。如果一个模型距离camera非常远,那么仍然以高精度的模型进行渲染显然是没有意义的。随着模型距离camera越来越近,我们可以不断增加模型的细节程度。

2. 物理以及动画的效率。在物理以及动画计算时,我们使用低精度的模型,之后再细分为高精度的模型。这将节省相关的运算能力。

3. 节省内存。我们可以将低精度的模型存储在内存中(硬盘,系统内存以及显存),之后通过GPU将其细分为高精度的模型。

下图显示了位于顶点着色器以及几何着色器之间的tessellation阶段。在本章节之前,我们的demo中还未使用过该技术,所以tessellation阶段并不像顶点着色器与像素着色器,其是可选的。

目标:

1. 了解用于tessellation的图元类型。

2. 了解每一个tessellation阶段的工作内容,以及每个阶段的输入和输出资源。

3. 学会编写Hull shader以及Domain shader将几何体进行细分。

4. 熟悉不同的细分几何体的策略以及硬件进行几何体细分对于性能的影响。

5. 学习贝塞尔曲线与平面的数学原理,与如何在tessellation stage实现。

14.1 Tessellation 图元类型

当我们使用tessellation进行渲染时,我们不会将三角形提交至输入装配阶段(IA stage)。相反,我们将提交patches与一组control points(控制点)。DX12支持,patch带有1-32个控制点,其图元类型如下:

D3D_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST = 33,
D3D_PRIMITIVE_TOPOLOGY_2_CONTROL_POINT_PATCHLIST = 34,
D3D_PRIMITIVE_TOPOLOGY_3_CONTROL_POINT_PATCHLIST = 35,
D3D_PRIMITIVE_TOPOLOGY_4_CONTROL_POINT_PATCHLIST = 36,

D3D_PRIMITIVE_TOPOLOGY_31_CONTROL_POINT_PATCHLIST = 63,
D3D_PRIMITIVE_TOPOLOGY_32_CONTROL_POINT_PATCHLIST = 64,

一个三角形可以认为是一个带有三个控制点的三角形patch(D3D_PRIMITIVE_3_CONTROL_POINT_PATCH),所以我们仍然能够将普通的三角形网格用作tessellation。一个面片可以认为是一个带有四个控制点的面片patch(D3D_PRIMITIVE_4_CONTROL_POINT_PATCH)。而这些patch在tessellation阶段都会被细分为三角形。

如果调用函数ID3D12GraphicsCommandList::IASetPrimitiveTopology时,我们传入的图元类型为patch与控制点,那么我们需要将PSO的D3D12_GRAPHICS_PIPELINE_STATE_DESC::PrimitiveTopologyType设为D3D12_PRIMITIVE_TOPOLOGY_TYPE_PATCH:

opaquePsoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_PATCH;

所以那些带有更多控制点的patch是什么呢?控制点的理念来源于构建某些类型的曲线与平面。如果大家使用过绘图软件中的贝塞尔曲线,那么我们将通过控制点来塑造曲线的形状。贝塞尔曲线的数学原理可以被延伸为贝塞尔平面。例如,我们可以创建一个贝塞尔面片,其带有九个控制点或者十六个控制点;控制点的数量越多,那么我们在塑造平面时可选择的角度也会越多。所以,所有这些带有多控制点的patch类型是为了支持这些类型的曲线与平面。在我们的贝塞尔平面的demo中有更详细的解释。

14.1.1 Tessellation与顶点着色器

由于我们将patch控制点作为图元类型提交至渲染管线,每个patch的控制点将成为顶点着色器的处理对象。因此,当我们使用tessellation时,顶点着色器将遍历每一个控制点,而我们也能够在tessellation开始前修改这些控制点。特别是那些将物理运算以及动画运算放在顶点着色器中进行处理的应用。

留下评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据