Chapter 3 – The Graphics Processing Unit

3.6 Tessellation阶段

tessellation阶段允许我们绘制带有弧度的表面。GPU的任务是接收每个表面的设置并将其转换为一组三角形。该阶段属于可选择的GPU特性,由DX11第一次引入。

使用tessellation阶段有以下一些优势。相较于为带有弧度的表面提供相对应的三角形,只提供表面的设置明显更为简便与紧凑。除了节省内存,这一特性还能让CPU与GPU间的数据交互不再是运行复杂动画角色的瓶颈。我们可以更有效率地基于camera来生成一定数量的三角形。例如,如果一个球远离camera,那么它所需要的三角形也就更少。Tessellation给了我们控制LOD(level of detail)的能力,也让我们可以控制程序的性能,例如,如果GPU比较弱鸡,那么使用一个精度较低的模型,这样才能保证帧数。普通的由平面表示的模型可以转换为三角形较多的模型,之后也能拥有更多的细节。

tessellation阶段常常由三部分组成。在DX中,这三个部分被称为,hull shadertessellatordomain shader。在OpenGL中,hull shader就是tessellation control shader,domain shader就是tessellation evaluation shader。而功能固定的tessellator在OpenGL中被成为primitive generator。

在第十七章我们将学习如何使用tessellation阶段。这里我们只会简单介绍每个tessellation阶段的功能。hull shader的输入资源是特殊的patch图元。其由多个控制点组成,这些控制点定义了将要tessllate(或者说将要细分)的平面,贝塞尔patch或者其他类型的弧度平面。hull shader有两个功能。首先,它会告诉tessellator需要以何种设置生成多少三角形,之后,他会处理每一个控制点。同时,hull shader也可以选择修正输入的patch,添加或者去除控制点。hull shader将输出一组控制点以及tessellation的数据,并传输到domain shader。如下图所示。

上图展示了tessellation阶段的整个流程。hull shader接收了以控制点(control point)定义的patch,之后将tessellation因子(tessellation factor)与类型传输到功能固定的tessellator中。hull shader可以转换控制点的位置并将其传输给domain shader,还包括tessellation因子以及相关的patch数据。tessellator将会根据重心坐标系创建新的顶点。所有的顶点之后会由domain shader进行处理,并输出三角形网格。

tessellator是管线中功能固定的一个阶段,只会被tessellation着色器使用。它的任务就是添加新的顶点供domain shader处理。hull shader将会把信息传输给tessellator,例如tessellation表面的类型:三角形,四边形,等值线(isoline)。等值线是一组线段,其被用于毛发的渲染。hull shader还会设置另一个重要的数据,就是tessellation因子。tessellation因子又有两个类型:内部以及外部边缘。两个内部的因子决定了三角形或者四边形内部的细分数量。外部的因子决定了外部边缘的细分数量。通过内部与外部的独立控制,我们可以保证相邻的弧度表面能够在细分数量上互相吻合。

一般来说,hull shader可以输出一个patch以及一组控制点。但是,其也可以将一个patch标记为“被舍弃”,只需将tessellation因子设为0或者负数。否则的话,tessellator会生成一个网格并将其传输给domain shader。每次调用domain shader时,我们都能使用hull shader中的控制点,基于这些控制点,domain shader可以输出每个新增顶点的数据。domain shader的数据流类似于顶点着色器,只不过domain shader处理的顶点来自于tessellator。最后我们会生成三角形并将其传输至管线的下一个阶段。

虽然整个系统看似复杂,但其在这一结构下着色器的效率更高,而每一个着色器的结构也会相对简单。一般来说,传入hull shader的patch并不会做过多的改变。这个着色器可能会使用patch到camera的距离或者屏幕的尺寸来设置tessellation因子。tessellator根据hull shader的tessellation因子,生成顶点,设置它们的位置并生成相应的三角形或者线段,但这一切都是固定功能的。考虑到计算的效率,tessellator并不属于着色器。domain shader能读取到新生成的每个顶点的重心坐标,之后可以使用这些数据以设置新生成的顶点的位置,法线,贴图坐标和其他一些顶点数据。下图中,左边的模型拥有6000个三角形,右边的模型进行了tessellation。

留下评论

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