第十三章 细分阶段

曲面细分阶段涉及曲面细分几何中涉及的渲染管线中的三个阶段。 简而言之,细分是指将几何细分为更小的三角形,然后以某种方式偏移新生成的顶点。 增加三角形数量的动机是为网格添加细节。 但为什么不创建一个详细的高分辨率网格来开始并完成? 以下是曲面细分的三个原因。

1.GPU上的动态LOD。 我们可以根据摄像机与其他因素的距离动态调整网格的细节。 例如,如果网格距离很远,则渲染高分辨率版本会浪费,因为无论如何我们都无法看到所有细节。 随着物体靠近相机,我们可以不断增加曲面细分以增加物体的细节。

2.物理和动画效率。 我们可以在低多边形网格上执行物理和动画计算,然后镶嵌到较高的多边形版本。 这通过以较低频率执行物理和动画计算来节省计算能力。

3.节省内存。 我们可以将较低的多边形网格存储在内存中(磁盘,RAM和VRAM上),然后将GPU细分为更高版本的多边形版本。

图13.1显示了细分阶段位于顶点着色器和几何着色器之间。这些阶段是可选的,因为到目前为止,我们尚未使用它们。


13-1 图13.1 渲染管道的子集,显示曲面细分阶段。

目标:
1.发现用于曲面细分的修补程序基元类型。
2.了解细分阶段每个步骤的作用,以及每个阶段的预期输入和输出。
3.能够通过编写hull和域着色器程序来细分几何图形。
4.熟悉不同的策略以确定何时进行细分并熟悉有关硬件细分的性能考虑事项。
5.学习贝塞尔曲线和曲面的数学以及如何在曲面细分阶段实现它们。

13.1 细分的基本类型

当我们渲染曲面细分时,我们不提交三角形到IA阶段。相反,我们会提交一些控制点的补丁。Direct3D支持1-32个控制点的补丁,并且这些补丁由以下基本类型描述:

D3D11_PRIMITIVE_1_CONTROL_POINT_PATCH = 8,
D3D11_PRIMITIVE_2_CONTROL_POINT_PATCH = 9,
D3D11_PRIMITIVE_3_CONTROL_POINT_PATCH = 10,
D3D11_PRIMITIVE_4_CONTROL_POINT_PATCH = 11,
...
D3D11_PRIMITIVE_31_CONTROL_POINT_PATCH = 38,
D3D11_PRIMITIVE_32_CONTROL_POINT_PATCH = 39

一个三角形可以被看作是带有三个控制点的三角形补丁(D3D11_PRIMITIVE_3_CONTROL_POINT_PATCH),因此您仍然可以提交常用的三角形网格进行细分。一个简单的四方补丁可以提交四个控制点(D3D11_PRIMITIVE_4_CONTROL_POINT_PATCH)。这些色块最终通过细分阶段细分为三角形。

那么具有更多控制点的补丁呢? 控制点的想法来自于构建某些种类的数学曲线和曲面。如果您曾经在Adobe Illustrator等绘图程序中使用Bézier曲线,那么您知道您通过控制点模拟了曲线的形状。Bézier曲线的数学可以推广到Bézier曲面。例如,您可以创建一个Bézier四色补丁,该补丁使用9个控制点来塑造它或16个控制点; 增加控制点的数量使您在修补修补程序时有更多的自由度。因此,所有这些控制类型基元的动机是为这些类型的曲面提供支持。我们在本章中给出了Bézierquad补丁的解释和演示。

13.1.1细分和顶点着色器

因为我们提交补丁控制点到渲染管道,所以控制点是通过顶点着色器被泵入的东西。因此,当启用镶嵌时,顶点着色器实际上是“控制点的顶点着色器”,我们可以执行任何控制 在镶嵌开始之前我们需要的点工作。通常情况下,动画或物理计算在几何图形细分之前以较低的频率在顶点着色器中完成。

13.2 THE HULL SHADER

在下面的小节中,我们将探索hull shader,它实际上由两个着色器组成:
1.Constant Hull Shader
2.Control Point Hull Shader

13.2.1 Constant Hull Shader

这个Constant Hull Shader是根据每个补丁评估的,并且负责输出网格的所谓曲面细分因子。曲面细分因子指示曲面细分阶段对曲面细分多少。以下是一个四个控制点的补丁示例,我们将它们统一镶嵌3次。

struct PatchTess
{
    float EdgeTess[4] : SV_TessFactor;
    float InsideTess[2] : SV_InsideTessFactor;
    // Additional info you want associated per patch.
};
PatchTess ConstantHS(InputPatch<VertexOut, 4> patch,uint patchID : SV_PrimitiveID)
{
    PatchTess pt;
    // Uniformly tessellate the patch 3 times.
    pt.EdgeTess[0] = 3; // Left edge
    pt.EdgeTess[1] = 3; // Top edge
    pt.EdgeTess[2] = 3; // Right edge
    pt.EdgeTess[3] = 3; // Bottom edge
    pt.InsideTess[0] = 3; // u-axis (columns)
    pt.InsideTess[1] = 3; // v-axis (rows)
    return pt;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值