您现在的位置是:首页 >技术交流 >第二十章 渲染管线网站首页技术交流
第二十章 渲染管线
渲染管线是计算机图形中最基础最核心的部分,它是将3D场景显示到2D平面的技术过程。在DirectX课程中,我们就介绍了渲染管线,分为固定渲染管线和可编程渲染管线(Shader)。但是在DirectX 10版本之后统一了渲染架构,就是将顶点着色器和像素着色器被合二为一,成为流处理器,它将同时负责顶点着色和像素着色。这使得GPU的利用率更加高,也避免了传统架构中由于资源分配不合理引起的资源浪费现象。最新的DX11也是采用流处理器的统一渲染架构。Unity开发Windows平台下的游戏时候采用的底层图形API肯定首选DirectX,我们点击菜单栏“Edit” -> “Project Settings”,然后选择 Player 类别并导航到 Other Settings选项,如下所示:
这里Unity会为我们的游戏运行平台自动选择合适的图形API。当我们取消自动勾选框的时候,Unity会给我们一个下拉选择框,让我们可以自定义使用那个图形API。大家应都清楚,最著名的图形API当属DirectX和OpenGL。我们可以看到Unity提供给我们的下拉选择框第一个就是Direct3D11,当然我们也可以选择其他(不建议)。
Unity对渲染管线的支持也经历了不同的发展阶段。
截止Unity2020版本而言,可以分为三种渲染管线,如下所示:
1.内置渲染管线是Unity的默认渲染管线。这是通用的渲染管线,其自定义选项有限。
Unity的内置渲染管线是 Unity 较陈旧的渲染管线。它并非基于可编程渲染管线。
2.通用渲染管线 (URP) 是一种可快速轻松自定义的可编程渲染管线,允许您在各种平台上创建优化的图形。通用渲染管线是由 Unity 制作的预构建可编程渲染管线。URP让您在移动平台、高端游戏主机和 PC 等各种平台上快速轻松地创建优化的图形。
3.高清渲染管线 (HDRP) 是一种可编程渲染管线,可让您在高端平台上创建出色的高保真图形。高清渲染管线是由 Unity 预先构建的可编程渲染管线。借助 HDRP 可以为高端平台创建出色的高保真图形。HDRP 可以用于高品质AAA 级游戏,但需要兼容的 GPU 硬件。
URP专注于性能,偏向移动端和低端机器,它拥有很多HDRP相同的功能,但为了在所有平台达到更好的性能,其做了一定的缩减,但这并不意味着URP做不出漂亮的东西。HDRP专注于高端图形渲染,以画面为主 , 偏向高端机器和影视,但要想得到完成利用HDRP的完美表现能力,需要大量的贴图,漫反射贴图、高光贴图、金属贴图、平滑贴图、AO贴图、法线贴图、凹凸贴图、高度贴图,所以不是对效果有特别大需求的话慎入。
HDRP提供高级和丰富的光照功能,比如实时全局光照(RealTime GI),能够模拟光线反射、体积光、能模拟光穿过空气中的粒子,还有重头戏的光线跟踪,一种新的光线反射和阴影渲染技术,其原理是跟踪光线在场景中放射的路径,模拟光线在真实世界里与物体交互的效果,这技术对硬件性能非常高,但能产生非常逼真的效果,可以直接用来做电影级别的预渲染作品。另外一个区别是Shader,HDRP提供一系列高端的shader特效,例如高度、细节和parallax Maps,分别用于纹理的位移、细节和深度模拟,它还支持子面散射,用于模拟光线穿过很薄的物体,比如皮肤和衣物,它提供了高级的shader,像是stacklit,能够让你同时使用多个材质的属性,比如子面散射、彩虹色、各向异性和模糊参数化。但好东西不是都在HDRP,2D光照和阴影就是URP独占的,所以如果你在做2D游戏,就选URP。
总结:如果是真实地游戏开发,尤其是手机端开发的话,可以考虑使用URP;如果是PC端游戏开发,并且有足够的美术人员支持,可以考虑使用HDRP开发AAA级游戏。很明显,三种渲染管线逐级提升游戏画面的品质,当然也需要高性能的GPU的支持。对于我们学习来讲,Unity的默认渲染管线就已经足够了。
如何在我们工程使用选择那个渲染管线呢?
首先是创建工程的时候,我们就可以进行选择,如下所示:
我们之前选择的“3D”就是Unity的默认渲染管线,其他两个红色线框标注的分别是“HDRP”和“URP”,从他们的名字上我们就能够看出来。下面是一个“URP”的工程,Unity会自动给我们创建一个默认场景,如下所示。
我们直接Play运行后的效果如下
如果忽略一些细节的话,整体的渲染效果还是不错的,场景中的地面,墙面以及木棍等等游戏对象都很栩栩如生,光影效果也非常不错。相比于多年前的一些国内游戏,画面提升很多。
相对于普通的“3D”工程(默认渲染管线)而言,他们之间有什么区别呢?
我们可以从“Package Manger”窗口查看一下,下面是普通的“3D”工程。
下面是“URP”工程的截图
我们发现,增加了一个“Univeral RP”的包,这就是Unity自定义的通用渲染管线。请大家注意的是,渲染管线的选择只是提升我们的游戏画质,模拟更加逼真的三维场景,对于我们的游戏逻辑影响并不是很大,更多的在于美术设计人员的工作内容。
当然,我们还可以继续创建一个“HDRP”工程,Unity也同样给我们提供了一个默认的场景,我们可以运行查看它的效果,如下所示:
我们可以查看它的“Package Manger”窗口
这个HDRP场景是三个房间,我们可以直接Play运行,查看效果。
鼠标可以选择视角,使用WASD进行移动,我们进入下一个房间
我们还可以继续向前移动,进入第三个房间
如果你是NVIDIA GeForce RTX系列的显卡,那么效果比截图更加逼真。
接下来,我们介绍一下如何将默认的渲染引擎升级到通用渲染引擎,首先我们创建一个“U3DProject”的“3D”工程。为了演示升级渲染引擎的效果,我们创建一个平面Plane和一个立方体Cube游戏对象,如下所示
两个游戏对象都位于世界坐标系的原点(0,0,0)位置。这里需要注意的是,由于Cube的轴心位于中心位置,并且Cube的默认尺寸就是一个Unity单位长度(1米)。因此,我们将Cube置于世界坐标系原点的时候,它有一半的部分是在地面的下面的。因此,我们将Cube的Position属性的Y值提高到0.5即可。这样整个Cube就位于平面的上面了。接下来,我们分别创建两个颜色材质,一个名称为CubeMaterial,一个名称为PlaneMaterial。
创建材质的方式为,在Project工程面板空白处右击,然后选择“Create”->“Material”。新创建的材质文件,默认处于重命名状态,我们直接录入材质名称即可。如下所示
接下来,我们分别点击选中两个材质文件,并在其Inspector检视面板中修改颜色值。
点击那个“吸管”旁边的白色矩形颜色框,会弹出一个“色环”窗口。
我们在“环”上选中一个主色系,然后在里面的“矩形”中选择一个具体的颜色值即可。
这样,我们就完成了一个颜色的材质。然后我们将Project工程面板中的“PlaneMaterial”材质拖拽到场景中的Plane平面游戏对象上面。
如果角色颜色不好看的话,还可以继续修改材质颜色,平面颜色会同步显示的。
接下来,我们以同样的方式来给Cube添加一个颜色,最终如下所示
设置完毕之后,我们调整一下相机的位置,方便观察平面和立方体。
接下来,我们保持相机选中状态,我们点击菜单栏“GameObject”->“Align View to Selected”
接下来,我们直接Play运行工程
可能大家角色Scene窗口中的游戏对象明显没有Game窗口中的“亮”一些。这是因为Scene窗口中的“灯光”效果没有打开,我们可以点击Scene窗口中的那个“灯泡”的按钮。
现在,即使不Play运行工程,Scene窗口与Game窗口中的亮度都一样了。
接下来,我们添加“Univeral RP”通用渲染管线包。
我们选择打开Window > Package Manager窗口。
点击“Packages: InProject”下拉框,选择“Unity Registry”
在列表中找到“Univeral RP”,然后点击“Install”安装。
然后,我们再切换回“Packages: InProject”查看
已经存在“Univeral RP”通用渲染管线包,同时在我们的“Project”视图中也能看到
接下来,我们在Project工程面板中的Assets目录空白处右键选择Create -> Rendering -> Universal Render Pipeline -> Pipeline Asset(Forward Renderer),点击后生成下面两个文件。
这两个文件分别是
“UniversalRenderPipelineAsset.asset”和“UniversalRenderPipelineAsset_Renderer.asset”。
然后在菜单栏选择Edit -> Project Settings -> Graphics选项。
然后我们要将“UniversalRenderPipelineAsset.asset”拖拽到上面的红框标识的地方。
接下来,我们就会发现场景中的游戏对象的材质全部丢失了。
很明显,这个问题就是我们安装并启用通用渲染管线造成的。
这里,我们需要将材质升级一下就能解决,点击菜单栏:Edit -> Render Pipeline -> Universal Render Pipeline -> Upgrade Project Materials to UniversalRP Materials
很明显,这是升级URP材质的意思,然后会有一个小弹框,如下:
我们选择“Proceed”即可,然后场景中的材质就回来了。
接下来,我们重新Play当前工程,查看运行效果
仔细对比前后两种渲染效果,我们发现灯光打在平面上面的颜色变得更加明显。同时,立方体的的颜色以及阴影效果也有了差异。可能也是因为我们的场景比较单一,如果是稍微复杂的自然场景,可能区分会大一些。我们以之前的“RoleDemoProject”工程来举例。
升级到URP渲染管线后如下
仔细观察,在颜色,明亮,以及一些细节上面,都有很大的区别。