标题：曲面细分
曲面细分概述
  曲面细分原理示例计算机不能直接生成曲线，当然更不能直接生成曲面。我们在计算机屏幕上看到的曲线、曲面实际上是由无数个多边形构成的。当然多边形越多，那么曲面就会展现的更为真实。在之前，这项工作都是由CPU完成的，但是CPU是通用处理器，几何运算性能有限，不能无限制的增加多边形数量。这也是我们在一些游戏中看到人的脸“棱角分明”的缘故。
Tessellation技术，便是一种化繁为简的手段，简单的理解，便是在一个简单的多边形模型中，利用专门的硬件，专门的算法镶嵌入若干多边形，以达到在不耗费CPU资源的情况下，真实的展现曲面的目的。
不过值得注意的是，与媒体宣传的不同，曲面细分技术并不是DirectX 11的全部，而只是DirectX 11的组成部分之一，更谈不上最重要的组成部分。
曲面细分技术的发展沿革
Tessellation技术，或者说曲面细分技术，是由ATI在2001年  曲面细分效果展示开发的，一直以来都是AMD-ATI的专属技术。最早应用在微软XBOX 360游戏机上，在PC上没有广泛采用。从ATI R600（Radeon HD2000系列）核心以来，曲面细分单元一直集成在AMD-ATI的GPU内部，不过并没有引起广泛关注，直到微软将其采纳，加入DirectX11 。这也是AMD将HD6000系列显卡中的曲面细分单元称为“第八代曲面细分技术”的原因。
事实上，在更早的DirectX 8时代，ATI就已经和微软联手开发了TruForm（N-Patch）技术，也就是Tessellation的雏形，并被纳入DirectX8.1。但由于该技术有一些不可控制的BUG，因此被DirectX9和DirectX10无情的抛弃了。 
Tessellation之所以未成气候，就是因为此前的技术还不够完善，另外GPU处理能力不足也是一大因素，因此ATI即便有微软的鼎力相助，也未能将该技术发扬光大。到了DX10时代，ATI虽然在全线GPU当中整合了Tessellator模块，无奈孤掌难鸣，并没有得到游戏开发商的支持。 
直到DirectX11时代，GPU自身的性能有了长足的进步，硬件上真正具备了细分曲面的实力，再加上微软重新改写API渲染流程，专为Tessellation开辟了新的着色器，这才让Tessellation技术得以重见天日。
曲面细分技术的实现原理简述
曲面细分，或者更准确的说“镶嵌化处理技术”，就是在顶点与顶点之间自动嵌入新的顶点。在自动插入大量新的顶点之后，模型的曲面会被分得非常细腻，看上去更加平滑致密。它是一种能够在图形芯片内部自动创造顶点，使模型细化，从而获得更好画面效果的技术。 曲面细分能自动创造出数百倍与原始模型的顶点，这些不是虚拟的顶点，而是实实在在的顶点，效果是等同于建模的时候直接设计出来的。 
曲面细分技术是完全可编程的，它提供了多种插值顶点位置的方法来创造各种曲面： 
1. N-Patch曲面，就是和当年TruForm技术一样，根据基础三角形顶点的法线决定曲面； 
2. 贝塞尔曲面，根据贝塞尔曲线的公式计算顶点的位置； 
3. B-Spline、NURBs、NUBs曲线（这三种曲线均为CAD领域常用曲线，在Maya中均有相应工具可以生成） 
4. 通过递归算法接近Catmull-Clark极限曲面。  nVIDIA的Tessellation DEMO展示Tessellation技术最初主要被用以“细分曲面”，随着该技术被纳入DirectX11范畴，得到大范围推广之后，插值顶点的算法也越来越多，因此用途也越来越广，产生了很多非常有创意的应用。 例如nVIDIA的一个Demo演示了利用Tessellation技术生产的“头发”，这些头发都是真实存在的，当然并不是为每一根头发建立一个模型，而是利用Tessellation技术在有限的头发模型中，镶嵌入更多的头发模型。
除了大幅提升模型细节和画质外，Tessellation最吸引程序员的地方就是：他们无需手动设计上百万个三角形的复杂模型，只需简单勾绘一个轮廓，剩下的就可以交给Tessellation技术自动镶嵌，大大提高开发效率；而且简单的模型在GPU处理时也能大幅节约显存开销，同时大幅提升渲染速度。
nVIDIA与AMD对曲面细分技术的实现
1.nVIDIA对曲面细分的理解与实现作为GPU领域的领军者，nVIDIA认为曲面细分技术所代表的GPU几何性能是新一代显卡最重要的功能，也是DirectX 11最重要的组成部分。GPU的发展从Geforce FX5800时代发展到Geforce GTX285，五代时间内像素处理能力增长了1500%，而几何性能只增长了300%。因此nVIDIA认为几何性能已经成为制约GPU性能的瓶颈，在新一代Fermi架构（费米架构，包括GT400，GT500系列显卡）中，要专门加强几何处理能力，曲面细分作为几何处理的典范便首当其冲得到了加强。
在Fermi架构中，nVIDIA通过PolyMorph Engine，将Tessellation任务分配给CUDA单元（CUDA单元也就是通常说的“流处理器”，nVIDIA称其为CUDA单元）处理。Fermi第一代旗舰显卡GTX480拥有15个PolyMorph Engine，也就等效于拥有15个具有Tessellation技术处理能力的单元。
nVIDIA这样做的优点在于，可以在高曲面细分负载下获得优秀的曲面细分能力，也就是在纯Tessellation计算中GPU的几何性能相当出色。在单纯的Tessellation计算中，nVIDIA以16倍于AMD的Tessellation处理单元的数量，得到了6倍于AMD的Tessellation处理能力。  不过缺点在于，这种设计占用了CUDA单元的计算能力，前文说过，曲面细分并不是DirectX 11的全部。在实际游戏中，并不是单纯的Tessellation计算。CUDA单元还要处理其他游戏相关的3D渲染数据，如果游戏中3D渲染数据处理需求不大，这种设计就不成问题，不过一旦3D渲染数据处理需求很大，比如高分辨率，高全屏抗锯齿，丰富的光影效果等，那么这种设计的缺陷就会暴露出来。
这就是在3DMARK 11中，GTX460成绩不如HD5830的原因之一，3DMARK软件图形、光照、抗锯齿计算压力很大，GPU还要分出CUDA单元去处理曲面细分计算，因此整体计算能力便捉襟见肘。再比如在《地铁2033》中，即使GTX580也不能打开全部效果在1080P下全程流畅运行， 且表现不及HD5970 。这与nVIDIA的曲面细分实现方法也是有关的。2.AMD对曲面细分的理解与实现作为Tessellation技术的开发者，AMD(ATI) 对曲面细分的态度有所不同。AMD认为，在当前的DirectX 11游戏中，将一个物体的细分后最小的像素在16个是比较合适的，过分的加大曲面细分负载所带来的变化，是人的肉眼无法分辨的。因此AMD坚持对模型做适度的Tessellation处理才是理智的，过分的加大Tessellation计算负载，只是在白白浪费计算资源，因为人的肉眼无法分辨。
在Evergreen架构（即HD5000系列）中，AMD秉承了自R600以来的做法，集成了一个专用的Tessellation处理单元。在之后的Northern Islands架构的Barts核心中（即HD6800系列），AMD又对Tessellation处理单元做了优化，通过增强的线程分配模块设计，Barts核心在低Tessellation计算负载下拥有1.5倍于5800系列的处理能力。当然高负载下仍然不理想。之后的采用Cayman核心的HD6900系列显卡，则将专用的Tessellation处理单元增加到2个。
AMD这种设计的优点在于，专用的Tessellation单元并不占用流处理器资源，不影响3D渲染数据的计算。在实际游戏中，画面分辨率越高，抗锯齿级别越高，3D渲染处理需求越大，这种设计的优势就越明显。
其缺点是，在3D渲染数据处理需求不大时，遇到高负载Tessellation计算，便力不从心。
2011年12月22日，AMD发布了新一代测采用SI GCN架构的AMD Radeon HD7970显卡。得益于GCN架构，其曲面细分计算能力也得到了飞跃式的发展。HD7970显卡的曲面细分单元概念被几何引擎流水线所代替，仍为专用的2个，但是采用了最新的硬件Tessellation迭代单元，提高了顶点的复用度、片外缓存设计有所增强、采用了更大参数的高速缓存，因此HD7970的Tessellation和几何缓存都有显著的增强，能在所有拆分倍率下达到4 倍于HD6970 。与竞争对手相比，HD7970较之于GTX580，以八分之一的几何引擎数量获得了1.6倍的性能。特别是这种设计仍不会占用显卡的3D数据计算资源。
支持曲面细分的硬件与系统
1.支持曲面细分技术的硬件曲面细分技术要求显卡支持DirectX 11，也就是目前的AMD HD5000、HD6000、基于全新GCN架构的HD7000系列显卡和nVIDIA的GT400、GT500、基于全新的Kepler架构的GT600系列显卡 。
值得注意的是，微软在将曲面细分纳入DirectX11时，做了优化修改。因此虽然AMD HD2000、HD3000、HD4000系列显卡也集成了曲面细分单元，但是并不兼容DirectX 11内的曲面细分技术，在DirectX 11游戏中无法打开Tessellation效果。2.支持曲面细分的操作系统需要操作系统为Windows 7，Windows 8或者升级了DirectX 11的Windows Vista。Windows XP不在支持之列。