● DirectCompute技术处理透明顺序排序
同时借助Direct Compute技术,DirectX 11可以实现次序无关透明。即物体不管以任何顺序进行摆放,GPU都能按照正确的前后关系计算透明。这个特性完全模拟了真实世界的透明行为。OIT次序无关透明使用了 Direct Compute 中的原子操作和 append buffer,在 GPU 内部完成 per-pixel fragment lists 和 sort,性能和精度都比传统的 alpha blending 有很大的提升。
简单的Alpha透明,效果显得杂乱无章;OIT透明,物体轮廓骨架显得非常清晰
上图所展示的Mecha主要是展示的OIT(order-independent transparency透明顺序排序)技术。以往的DirectX中对于透明物体的叠加处理是非常复杂的,因为透明物体的层次关系相当复杂,特别是烟雾、火、水、玻璃等等东西混合在一起的时候,程序很难判定物体的层次顺序。
这些以前都依赖程序员的手工指定,并且有些透明物体像烟雾、火焰等等这些透明的物体没有严格形状模型,并且变化相当迅速,处理这些透明物体会消耗程序员和GPU相当大的精力和性能。
微软在DirectX 11中引入了OIT技术来实现多个透明物体的快速混合,通过OIT技术可以很好的应付多重乱序透明处理,从而实现实现透明物体的快速正确排序。
实际上OIT技术是DirectCompute11中的一部分,OIT的对透明物体排序的实现都是通过DirectCompute11来实现的,并且实现起来非常简单。另外,在OIT中微软首次提到了使用原子操作,至于原子操作的具体意义对于非图形编程人员就不需要了解了,另外微软还提到OIT还提供了单独的缓存来提高处理透明物体的排序。
OIT效果的运算方面,原则上是可以通过流处理器单元来独立实现的。但是DirectX 11中定义OIT效果需要原子操作。基本上,DirectX 11新引入的几种特效中,除了曲面细分之外其他的都走得Compute Shader技术和原子操作。微软的说明里OIT是走CS5.0路径的,也就是说原子操作性能将大幅度影响到OIT效果的最终表现。
事实上很多测试结果也说明OIT效果确实可以从存储系统尤其是cache的优化中得到显著的好处,原子操作是很依赖Cache和Shared Memory。如果是传统手段实现的话,肯定是一层一层的贴图,像这种顺序比对忽略的操作肯定是要一来原子操作+数列和归约的。原子操作跟内存控制一样,必须通过固定单元来实现,Shader只是运算器,不能达成控制功能。