手把手教你成为Shader编程实战达人—GPU

GPU编程市场应用


GPU全称是Graphics Processing Unit,中文成为图形处理器,所以GPU编程也叫图形学编程,它是针对的显卡中的芯片编程,游戏引擎的更新换代发展的一个重要阶段是显卡芯片的出现,引擎的渲染能力得到极大提升。GPU 加速器于 2007 年由 NVIDIA® 率先推出,引擎的更新换代也是跟GPU硬件息息相关的,从固定流水线变成了可编程流水线,画面品质得到了质的飞跃。总的来说,GPU编程主要分为两大分支:
手把手教你成为Shader编程实战达人—GPU_第1张图片
现在流行的大数据计算,采用的就是GPU集群编程,从事GPU集群编程可以从事一些高端的行业,比如大数据分析计算等等。另外,作为高性能计算新的应用领域,深度学习(Deep Learning)是近年来机器学习的热点,以GPU集群方式对数据或深度网络模型进行并行化,加速程序执行效率。已广泛应用于Google、百度、Facebook,阿里,京东,华为等公司以及中国的高性能计算机。

我在读研究生期间,我们经常利用GPU集群解决海量数据的计算问题,比如:计算海量模型数据的网格分割,通过GPU集群后计算速度非常快。另外,GPU集群还用于动漫的模型和场景渲染,网上有很多提供渲染服务的渲染农场,专用于对数以几百万面的模型渲染。

使用GPU在游戏中的渲染,我们利用GPU渲染模型材质和场景,不论是模型材质还是每帧运行的游戏图片,它的内部都是由RGB或者RGBA元素组成,换句话说,它是由数据矩阵组成的,利用GPU对图片数据进行再加工,就可以得到非常绚丽的画面,GPU对矩阵计算效率非常高,我们只是简单的利用了单GPU的计算能力就足以应付游戏的渲染了。下图是我们研发的引擎实现的游戏截图如下所示:

总之,我们不论做GPU集群还是只是用GPU做渲染,都是利用了GPU强大的加速计算能力。

GPU编程前景如何?

GPU集群这块给读者简单的介绍一下,它的前景非常好,也是未来一个发展趋势,进入大数据时代,无人驾驶,机器人时代,这些都需要GPU处理,另外,市场上有很多大数据公司招聘需要GPU集群能力的工程师,前景是非常看好的,市场需求很大。但是本课程主要针对的是GPU渲染编程,本课程会针对这方面进行重点讲解。

目前国内最流行的引擎是Unity和UE4,二者都是国外制作的,虽然各大游戏公司也有自己的引擎,实话实说,自研引擎跟商业引擎还是有些差距的,在这里不是贬低国内自研引擎,不说别的,看看国内开发者对Unity和UE4引擎的使用就可以看出当前国内程序员的水平。下面是国外公司利用Unity渲染的效果,如下图所示:

手把手教你成为Shader编程实战达人—GPU_第2张图片

Unity引擎和UE4引擎虽然提供了Shader库,但是在游戏制作过程中还会有提一些新的需求,需要我们自己编程实现的效果。这些需求的实现就体现了GPU编程的水平了。

UE4渲染也是一样的,国内的开发者对GPU编程的使用无法真正的发挥出它的渲染功力,我们看看国外公司制作的游戏渲染画面,如下图所示:
手把手教你成为Shader编程实战达人—GPU_第3张图片

我们经常说游戏的评级:S级大作,A级大作,B级,C级,评级一方面是看画面品质,一方面是看游戏策划,游戏的第一印象还是画面品质,这个就会涉及到GPU渲染。GPU渲染遍及游戏的各个方面,从物体的渲染,粒子的渲染到整个场景的渲染,处处都有GPU的影子。

要想在激烈的IT竞争中立于不败之地,作为程序员必须要不断地提升自己的编程技能,除了掌握一门技术外,必须要再掌握一门技术,而且这门技术市场需求要大,不论你选择是GPU集群还是GPU渲染编程,虽然方向不同,但是都是利用GPU强大的计算以及加速能力。游戏渲染这个分支市场需求同样大,大家看看最近腾讯,网易公司招聘图形学工程师薪资截图:

手把手教你成为Shader编程实战达人—GPU_第4张图片

手把手教你成为Shader编程实战达人—GPU_第5张图片

还有很多的IT公司这里就不一一列举了,大家在百度或者招聘网站搜索:图形学工程师招聘,可以看到许多大大小小的公司对图形学工程师的需求,而且薪资相对逻辑编程高一大截,前景形势一片大好。

其实不论是使用Unity引擎和UE4引擎还是自研引擎,都离不开GPU编程,检验引擎其中一个非常重要的指标就是渲染。

如何学习GPU编程?

既然GPU编程前景这么好,作为初级程序员或者想学习GPU编程的开发者该如何系统的学习呢?这个也是我们的课程所要解决的核心问题。学习一门语言,我们还是要寻找一门能够系统的学习的课程,这个也是我们多年的工作经验积累结果,市面上有很多关于GPU编程的书,比较经典的书籍《GPU Gems》系列,中文名字:《GPU编程精粹》,对于这些大部头的书籍,并不适合初学者学习。而本课程的内容专门为初学者及以上的程序员量身打造的,主要分三大篇:

基础篇:GPU编程常用的向量,矩阵,四元数运算以及GPU与CPU的通信原理等等这些都是经过提炼后的知识,非常实用;

进阶篇:掌握了基础模块的知识后,接下来就要进一步学习与GPU相关的知识了,着色器,纹理,混合,模板等等都是与GPU编程相关的技术点,掌握这些技术点,为深入学习GPU编程打下坚实的基础。

提高篇:本篇讲解的都是与实际案例相关的技术,市面上运行的游戏都与这些技术点相关,掌握了它们可以直接将其应用到自己的项目中;

在这里我把学习大纲给读者列一下:
手把手教你成为Shader编程实战达人—GPU_第6张图片

下面就说说我设计这个课程的一些想法,严格来说我也是跨行业的,以前是搞服务器的,读研究生时方向变成了图形学,刚接触GPU编程,跟大多数程序员一样的,对此啥都不懂,不管怎样既然选择了就要走下去,经过十多年的学习,逐步有了一些心得体会。目前国内学习图形学的程序员相对来说比较少,在此也想把自己的一点经验分享给哪些想从事图形学开发的爱好者。

首先看基础篇的内容,选择了向量和矩阵运算,这两个运算不仅在GPU中使用的频繁,在游戏引擎中也是最基础的部分,非常重要。我也会在课程中详细的介绍向量和矩阵的运算,这样在后面的实战项目里面用起来就得心用手了。渲染管线的出现是引擎发展的一个里程碑,在没有GPU之前,我们使用的是固定流水线,这个也是当时主流引擎使用的,我还专门为此写过一本书《手把手教你架构3D游戏引擎》电子出版社,感兴趣的读者可以看看。另外也出过CSDN视频教程:
《3D游戏开发套餐》这些也是关于学习GPU编程的基础,基本的向量和矩阵运算,GPU出现后,以前的固定流水线变成了可编程流水线。GPU强大的计算能力,不仅应用于渲染,也加速了人工智能,深度学习这些大数据平台的发展。可编程渲染管线从DX9开始到现在比较成熟的DX12,自身也经历了发展,从顶点着色器,可编程着色器,到几何渲染,软件与硬件相互促进,效果也越来越好,效率也在逐步提升。给读者展示一下DX12的可编程流水线:

手把手教你成为Shader编程实战达人—GPU_第7张图片

上图是DX11,DX12的固定流水线示意图,明显比以前的DX8,DX9多了很多项,这些都增加了渲染效果。会在后面的课程中详细介绍,这里给读者提示一下。

CPU与GPU交互,我们在游戏优化时,会看这几个指标,DrawCall的数量,内存占用,其中DrawCall的数量涉及到CPU与GPU的交互,为了让读者真正的明白二者的交互,会单独拿出一节课讲解。掌握了这些知识,对于学习GPU前期准备工作足够了,接下来我们就需要进阶了。

进阶课程的中会用到我们基础教程中的知识,我们的课程是环环相扣的,着色器编程作为Shader语言最基本的操作,作为开发者必须要掌握的,不论可编程流水线怎么变换,顶点着色器和像素着色器一直存在的。我们的GPU渲染说的直白一些,渲染是针对图片进行的,也就是我们说的纹理,游戏运行也是一张张图片快速播放。纹理存储的是RGB或者RGBA的像素矩阵,GPU对矩阵的计算是非常钟爱的,速度非常快。混合模式在渲染中比较常用,它针对的是需要镂空的物体,比如树叶渲染就会用到混合。

进阶课程的后面的技术从模板到环境光散射,列这些技术的目的是让读者知道它们实现的原理,它们是GPU编程中的核心技术,这些技术在渲染中被广泛应用,比如我们使用的Unity引擎和UE4引擎,二者都提供了这些技术点的实现。渲染并不是这些单一技术点的实现而是组合起来使用效果更佳,我们讲解的技术点都是以实用实战为主。

提高篇也是实战篇为了方便读者更快的掌握Shader编程我们使用了Unity这个应用最广泛的引擎作为基础,我们只需要关心Shader的编写就可以了,而无需关心引擎内部的实现及优化。提高篇列举的GPU实现知识点是游戏项目实战中经过检验过的,它们大部分都取自游戏项目的开发。

我们这个课程设计了以上三个阶段学习,是一个逐步进阶的过程,也是GPU编程提升的过程,这么设计的其中一个重要原因是让开发者分阶段学习,也是一个逐步提升,循序渐进的过程。项目中涉及到GPU编程,也会涉及一些优化技术讲解,这样读者不仅会编写GPU程序,也会在此基础上进行优化。

总结

学习GPU编程,上面提到学习课程是最基础的,必须要掌握的,但是GPU编程的学习远远不止这些,真正使用好了GPU编程,它能为我们做很多事情,甚至可以使用GPU编写小游戏。现在游戏中使用的批处理,是CPU与GPU通信的频率,随着硬件的革新,GPU的可编程流水线也会越来越容易。

你可能感兴趣的:(3D引擎,游戏制作)