Directx12 曲面细分详解

(一),曲面细分

  曲面细分(Tessellation)。最初由ATI开发,主要目的是和来细化模型,精细化场景表现,微软将其采纳后加入DirectX 11,成为DirectX 11的组成部分之一。由于这种技术广泛的应用在曲面的几何处理上,但这种技术也可以用在其他诸如模型构建、平滑处理等领域。

这里写图片描述

  这张图直观的展示了曲面细分的一个重要能力--细化模型,通过曲面细分,我们可以把一个对粗糙的模型(上图左)精细化为一个更平滑的模型(上图中),再配合贴图置换(Displacement Mapping ),可以表现出细节非常丰富的物体形象。
  自Directx11引入曲面细分后,曲面细分得到了快速的发展。当然,即使我们将曲面细分任务从CPU移到GPU,曲面细分的性能消耗也还是非常可观的,滥用曲面细分将导致极大的性能问题。

(二),Directx12曲面细分规则

  在DirectX中,我们只能配置曲面细分而无权控制曲面细分规则,但这些规则至今微软没有给出,我们只能通过细分表现来推测其细分规则以便更好的理解和运用。

1、三角形的细分

(1)、Tessllation因子规则

  三角形的细分,我们需要配置三个EdgeTess和一个InsideTess,我们来看看不同的Tess值的影响
(为方便比较和简单,三条边和内部tess factor值设置成一样,而且partitioning(“integer”))。
这里写图片描述  这里写图片描述  这里写图片描述  
这里写图片描述  这里写图片描述  这里写图片描述
这里写图片描述  这里写图片描述
  根据上图,我们来分析一下三角形不同tess factor情况下的规律。
  可以看出在奇数的情况下,1, 3, 5, 7,…, 三角形包括(N+1)/2个环形的的三角形,而中心是一个三角形。在偶数的情况下,三角形内部包括N/2个环形的三角形,但中心是一个点,而不是一个三角形。三角形的边在tess factor 1-8的情况,分别被分为1-8段,对于内部的环形三角形,从外到内,每进一个层次,边分段数是是上一个边分段数减2,比如tess factor = 5,有三个环形三角形,最外边的边分段是5,中间的一个是3,最里面的是1。
  在tess factor 1-8的情况下,细分的三角形个数为:1, 6, 13, 24, 37, 54, 73, 96, 121, 150…
  奇数tess factor:1, 13, 37, 73, 121, => 12, 24, 36,48,…(6*2, 6*4, 6*6, 6*8…)
  偶数tess factor:6, 24, 54, 96, 150, => 18, 30, 42, 54, … (6*3, 6*5, 6*7, 6*9…)

  在DirectX中,每条边以及内部 tess factor也可以不一样,比如三条边的细分因子是2、3、4,内部细分因子是3,则三角形的细分如下图所示:

这里写图片描述

  上面就是在DirectX12中,三角形Tess因子对细分的影响规则。

(2)、Partitioning因子规则

  在DirectX12中,Partitioning因子可以有四种,分别为fractional_odd,fractional_even,integer,pow2,下面我们看看fractional_odd,fractional_even时,三角形的细分的变化。
  在fractional_even时,tess factor在1-8的情况下的细分效果:
这里写图片描述  这里写图片描述  这里写图片描述  这里写图片描述
这里写图片描述  这里写图片描述  这里写图片描述  这里写图片描述
  从上图,fractional_even表示tess factor是偶数,范围是2-64,如果此时tess factor为1,则和2的结果是一样的,如果此时tess factor为奇数,则细分效果不均匀。
  在fractional_odd时,tess factor在1-8的情况下的细分效果:
这里写图片描述  这里写图片描述  这里写图片描述
这里写图片描述  这里写图片描述  这里写图片描述
这里写图片描述  这里写图片描述
  从上图,fractional_odd表示tess factor是奇数,范围1..63, 此时细分效果和Integer是一样的,如果此时tess factor为偶数,则细分效果则比较诡异,偶数的细分并不均匀。
   pow2应该是2的幂次tess factor才有效,具体读者可以自行测试看看。

2、四边形的细分

  四边形的细分,我们需要配置四个EdgeTess和两个InsideTess,我们来看看不同的Tess值的影响
(为方便比较和简单,四条边和内部tess factor值设置成一样,而且partitioning(“integer”))。
这里写图片描述  这里写图片描述  这里写图片描述  这里写图片描述
这里写图片描述  这里写图片描述  这里写图片描述  这里写图片描述
  上图是tess factor1-8时候的细分图,从上图可以看到,四边形在不同tess factor时,四边形细分的细节,tess factor是偶数时候,细分的三角形是对称的,奇数时候,只有一条对角线,细分的三角形是不对称的。相比三角形的细分,四边形的相对来说还算简单,但边的细分以及内部环绕四边形的概念和三角形是一样的,奇数时,中心是一个小的四边形,偶数时中心是一个点。
  上面就是在DirectX12中,四边形Tess因子对细分的影响规则。

(三),参考文献

1、DirectX 11 Tessellation (曲面细分) http://www.nvidia.cn/object/tessellation_cn.html
2、Directx11教程(61) tessellation学习(3) http://www.cnblogs.com/mikewolf2002/archive/2012/08/13/2635666.html
3、Directx11教程(62) tessellation学习(4) http://www.cnblogs.com/mikewolf2002/archive/2012/08/13/2636976.html

猜你喜欢

转载自blog.csdn.net/yolon3000/article/details/80037996