●什么是Tessellator?
在此之前,关于DirectX 11的报道可谓铺天盖地。事实上,自R600发布时,DirectX 11这个字眼才开始越来越多的出现在网络上。尽管R6xx和R7xx硬件都具有tessellator单元(编者按:Tessellator是一种硬件多边形细分功能,也称分块单元),但是由于tessellator属于专有实现方案(proprietary implementation),所以R6xx和R7xx硬件是不能直接兼容DirectX 11,更何况DirectX 11采用了极其精密老练的设置过程。事实上,DX11 tessellator单元本身不具备可编程性,DX11向tesselator (TS)输入或者从中输出的过程是通过两个传统的管线阶段完成的:Hull Shader (HS,外壳着色器)和Domain Shader (DS,域着色器)。
tessellator可以把一些粗大无序的图形分成很多更小的图形。tessellator还可以将这些小图形组合到一起,形成一种有序的几何图形,这种几何图形更复杂,当然也更接近现实。tessellator可以让某一图形变成立方体,并通过旋转让其从底部看起来像是个球形,这样的话无疑节省了空间。此外,图形的质量、性能以及可控性也达到了一定的促进。
Hull Shader负责接收琐碎的图形数据和资料(patches),而control points将会基于如何配置tessellator来产生数据。这些琐碎的图形数据和资料会形成一个新的primitive单元(类似于顶点单元和像素单元),这种primitive单元可以将平面的一段分块处理。Control points用来定义想要得到的图形(比如说一个曲面或者其他)的图形参数变量。如果您经常用Photoshop绘图软件的话,不妨把Control points理解为PS的钢笔工具:用平面代替线的贝塞尔曲线功能。Hull Shader采用control points来决定如何安排tessellator处理数据,利用Tessellator生成大批量的、确定数量的点,然后将数据传送给Domain Shader,Domain Shader将这些点转换成3D处理中的顶点,最后GPU生成曲线以及多边形。
tessellator只负责分块处理。tessellator将Hull Shader基于某种参数而传送给自己的琐碎图形数据和资料分离成点,再将分离出来的一系列点发送给Domain Shader,后者将会完成这些点到图形的过程的处理。那么,编程人员就得为他们的代码编写Hull Shader程序,而不需要考虑TS的变成任务。可以说,tessellator就是一个固定功能模块,用来处理一些基于一定参数的输入数据。
Domain Shader将会接收由tessellator产生出的点,并依照终点控制(control points)以及/或者置换贴图将这些点形成一个合适的几何图形。Domain Shader通过运行开发者设计的DS程序来执行这些操作,这些DS程序控制这些新产生的点如何转移或者如何按照终点控制以及纹理渲染取代这些数据。处理完毕这些点之后,Domain Shader将会输出一个个顶点。我们很可能就会看到大量Domain Shader输出并直接进行光栅化,以便几何图形可以分散到屏幕上进行像素处理。现在我们已经大概解了tesselator大致能做什么、怎么做,但是此时你可能会问自己:“难道几何渲染就不能用来创造分块图形表面并且产生顶点吗?事实上,“你”是对的,理论上存在这种可能,但是目前还不太切合实际。现在让我们再深入了解一下DX11吧!