毫无疑问,多边形是组成3D图像的基石。但是DirectX 10之前的GPU只能对像素进行处理,生成多边形是CPU的工作。比如基于DirectX 9的GPU如果需要建立3D模型,只有依赖CPU,然后重新载入并贴图。DirectX 10在这方面做出了改进,加入了几何渲染单元。但是几何渲染单元并非是想象中可以独立生成多边形的设备。在实际应用中,几何渲染单元更多的是对CPU生成的多边形进行加强、模仿。比如CPU给出多边形信息,GPU利用集合渲染单元将同类型的多边形加以复制处理,或者做出类似于影子的多边形效果。要想独立生成多边形,目前DirectX 10是做不到的。但DirectX 11新增加的镶嵌处理却可以在一定程度上生成多边形——新加入Hull Shader、Tessellator和
Domain Shader这三个渲染单元的目的正是为了完成这项工作。
Tessellation的工作流程示意图
那么镶嵌处理是如何工作的呢?首先,GPU依旧从CPU那里获得多边形数据和资料,顶点渲染单元(实际上是统一渲染架构作为顶点渲染单元使用)生成顶点,并制定控制点;接下来,处理好的资料会被传输到Hull Shader。Hull Shader根据程序将载入控制点,生成如贝塞尔曲线(Bezier
Patch)等平滑曲线,并对数据进行基础处理;而后,Hull Shader会将调整好的数据传输给
Tessellator,利用Tessellator生成大批量的、确定数量的点(Tessellator并不知道控制点的相关信息),这样Tessellator就会在原有多边形的区域内(控制点确定的区域内)确定大量的点;下面,得到数据的Domain Shader会将这些点转换成3D处理中的顶点;后,GPU自行生成大量的曲线,和多边形。
这幅图片说明了BC3和BC7压缩的差别。左侧是原始纹理,右侧是压缩后的纹理,中间是压缩中损失的图形信息的示意图。压缩损失越少,颜色越接近黑色。由于BC7是为低动态范围纹理设计的压缩模式,压缩率虽然不太高,但是在画质效果表现方面依然令人无可挑剔。
Tessellation的优势在于需要少量的数据点就可以生成大量多边形。这项技术应用非常广泛,比如无限远的视距范围内的物体生成,又如运行游戏时,只有走到一定距离,地面物体才会渐次显示出来,如果调节游戏的“远视距”,虽然能够减轻这种现象的发生,但不能根本解决问题。
如果采用Tessellation就可以让游戏中的物体显示在无限远的视距中—远处的物体可以使用低档次的特效等级,近处的物体采用高档次的特效等级。这样就更加真实。另外一个重要的应用在于,CPU的压力被转移到GPU上了,因为CPU不再需要大量生成多边形,只要给予GPU合适的控制点,GPU就可以完成这种简单而重复性高的工作。CPU空闲出来的性能可以更好地完成AI处理等其他工作。
精细的纹理对视觉效果的增益是显而易见的。目前的3D游戏越来越倾向于使用更大、更为精细的纹理,但是过大的纹理严重占用显存和带宽。由于目前纹理压缩仍然不支持HDR图像,因此
DirectX 11提出了更为出色的纹理压缩算法——BC6和BC7。BC6是为HDR图像设计的压缩算法,压缩比为6∶1;而BC7是为低动态范围纹理设计的压缩模式,压缩比为3∶1。两种压缩算法在高压缩比下画质损失更少,效果更出色。
这是一幅对HDR文件的压缩示意图,BC6的压缩相对于原图来说,仅仅损失了极小的画质,却获得了非常出色的效果。
纹理质量对画面效果起着至关重要的作用。比如我们运行3D游戏时,画面内同样一个物体,观察距离较远时,纹理锐利而清晰,但当你拉近视角,近距离细看时,纹理就非常粗糙了。更不用说在某些游戏中还有类似放大镜、望远镜等道具,启用这些道具后,只能看到更为粗糙和不真实的纹理。出现这种问题,一方面是纹理压缩率损失严重,细腻的纹理压缩存放后,损失大量细节;另一方面是大纹理难以保证保证游戏运行速度和软件体积,如果在游戏中大面积采用分辨率高达
4000dpi的纹理贴图,那么显卡的运算资源和显存容量很快就会告罄。因此,DirectX 11快速和直观的改变就是再次改进了纹理的压缩算法,将纹理体积和纹理质量控制在一个相当优秀的范围之内。