很多游戏开发者都对DX11新增的Compute Shader(通常简称为CS)特性啧啧称赞。CS的这一渲染管线能够进行更多的通用目的运算。我们既能在某种可以用来被执行数据的操作中看到这种特性,又能在某种可以用来操作的数据中看到这种特性。
其他渲染管线阶段,我们会看到某种限制妨碍了通用目的代码。尽管我们可以在一个像素着色程序中强行加入通用算法,但是我们却不能随意利用诸如树形结构之类的数据结构,在像素间共享数据的成本是非常高昂的,而且我们必须绘制三角数据结构,并在这些数据结构中加入贴图方案。
在DirectX11以及CS的帮助下,游戏开发者便可以越过复杂的数据结构,并在这些数据结构中运行更多的通用算法。与其他完整的可编程的DX10和DX11管线阶段一样,CS将会共享一套物质资源(也就是着色处理器)。
相应的硬件需要在运行CS代码时更灵活些,这些CS代码必须支持随机读写、不规则列阵(而不是简单的流体或者固定大小的2D列阵)、多重输出、可根据程序员的需要直接调用个别或多线程的应用、32k大小的共享寄存空间和线程组管理系统、原子数据指令集、同步建构以及可执行无序IO运算的能力。
与此同时,CS也将会随之失去一些特性。因为单个线程已经不再被看成是一个像素,所以线程将会丧失几何集合功能。这就意味着,尽管CS程序依然可以利用纹理取样功能,但是自动三线LOD计算将会丧失自动功能(LOD必须被指定)。此外,一些并不重要的普通数据的深度拣选(depth culling)、抗锯齿(anti-aliasing)、α混合(alpha blending)以及其他运算不能在一个CS程序中被执行。
由CS带来的新型应用实际上是无限的,是取之不竭的,但现在的问题是,很多游戏开发商们的兴趣是如何利用一些先进的技术来增强他们的游戏引擎,而这些技术恰恰不可能用在像素着色器中(Pixel Shader)。其中,这些新型应用就包括A-Buffer (A缓存) 取样技术,该技术可以很大程度上增加抗锯齿以及无规则透明度的性能,可以带来更先进的Deferred Shading(延迟着色)技术、更先进后处理效果(post processing effect)和卷积运算、以及更先进的专为频域运算的快速傅利叶转换(Fast Fourier Transform,FFT)以及区域求和表算法。
除了某些特殊应用的渲染,游戏开发者可能同时也希望做一些诸如IK(inverse kinematics,逆运动学)、物理、人工智能以及其他在GPU上执行的传统的CPU任务之类的运算。用CS算法在GPU上执行这些数据意味着这些数据将会更快的被渲染,而且一些算法可能在GPU上的执行速度更快。如果某些总是产生同样结果的算法既可以出现在CPU上又可以出现在GPU上的话,诸如AI以及物理等运算甚至可以同时在CPU和GPU上运行(这种运算实际上也可以代替带宽)。
即便是这些运算代码在相同的硬件(CPU或者GPU)上运行,PS以及CS代码的执行也是两个截然不同的过程,这主要取决于被执行的算法。有趣的是,暴露数据以及柱状数据经常被用作HDR渲染。用PS代码计算这些数据的话就需要几条通道和几种技巧,以便提取所有像素,从而集中或者平分这些数据。尽管共享数据将会或多或少的减缓处理速度,但是共享数据的方式要比在多通道中计算速度更快,而且这样可以使CS成为这些算法的理想处理阶段。