Chapter 3 – The Graphics Processing Unit

3.10 计算着色器

除了传统的图形管线,GPU还能处理其他工作,例如现在最为流行的深度学习等各种领域。而这一类的操作则被称为GPU computing。CUDA以及OpenCL这一类的平台则将GPU作为一个大型并行处理器,而且并不会使用到GPU图形相关的功能。一般来说,这一类的程序将使用C或者C++作为开发语言,配合GPU专属的库。

DX11首先引入了计算着色器(compute shader),而这一着色器并不是图形管线的一部分。但该着色器通过图形API进行调用。它可以与顶点着色器,像素着色器,以及其他着色器一起使用,同时也会利用统一的着色器处理器。而计算着色器和其他着色器很类似,它也有一组输入数据,也可以使用buffer(例如贴图)作为输入或者输出。在计算着色器中,warp与其相对应的线程更为直观。例如,每次调用计算着色器,我们都可以拿到一个线程索引。同时还有线程组(thread group)这一概念,在DX11中每个线程组由[1,1024]个线程组成。线程组则带有x轴,y轴,z轴,这样能便于在着色器中使用线程组。每一个线程组都有一小块内存供线程组中的线程共享。在DX11中,这一内存块的大小为32KB。计算着色器由线程组运行,因此线程组中的所有线程都会并行运作。

计算着色器的一个优势是,它可以读取GPU所生成的数据。由于将数据从GPU传输至CPU是比较缓慢的,所以将处理的数据保留在GPU中可以大大提高性能。计算着色器常被用于实现post-process的效果。上文中提到的共享内存,意味着我们在采样图像的像素点时可以将采样结果与周边的线程行共享。使用计算着色器来决定图像的离散程度或者平均亮度将远远快于像素着色器,前者的速度可能是后者速度的两倍。

计算着色器还能用于粒子系统,网格处理,例如面部动画,剔除,图像filtering,改进深度值的精度,阴影等等。在GPU Zen一书中还展示了如何使用计算着色器替代tessellation着色器。

这就是本章节的最后一部分。当然,还有其他许多方法去使用GPU的功能去处理渲染相关的工作。而这些相关的理论与算法正是本书的核心内容。之后的章节,我们将学习空间转换以及着色。

留下评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据