在Unity 5中如何减少Draw Call
本文将为大家介绍Unity 5中标准着色器的基本概念,并深入分析如何减少Draw Call(在Unity 5中显示为SetPass calls,下文的Draw Call皆表示SetPass calls)。
标准着色器概述
标准着色器是基于物理的着色器,它能够在各种光照条件下正确渲染出逼真的效果,并且支持跨平台使用。该着色器拥有纹理字段,可通过启用不同功能来改变自身特性。
在正文开始前,我们先来看一段展示标准着色器效果的视频。
标准着色器会依据纹理字段所选用的纹理,改变自身包含的功能,进而控制着色器的执行速度。如下图所示,尽管两个材质使用的是同一个着色器,但实际表现仍存在差异。这两个着色器在渲染场景时是完全不同的(尽管都属于“标准着色器”),因此若想减少Draw Call,就需要采用不同的处理方式。
接下来,我们先介绍通用的减少Draw Call的方法,然后再讲解在Unity 5中使用标准着色器时如何减少Draw Call。
手动减少Draw Call
无论是在Unity还是其他引擎中,减少Draw Call的关键在于尽可能少用材质。减少材质基本可按以下步骤进行:
- 按照所用的着色器类型对材质进行分类及整合 为了便于说明,我们以一个简单场景为例,该场景中仅有4个材质,且每个材质都使用Bumped Diffuse着色器。注意,此时场景的SetPass calls为4。
- 将使用同一着色器的材质的纹理合并为纹理集 这里每个着色器有两张纹理,一张基本纹理和一张Bumped Diffuse要用的法线纹理。我们需要将这些纹理保存到工程中,以供后续使用。
- 创建一个材质,让其包含着色器及第二步创建的纹理集 创建一个新的材质,并设置好两个纹理和着色器(本例中为“Bumped Diffuse”)。
- 重新对用到该着色器的网格进行纹理映射以匹配纹理集中的纹理坐标 这一步可以在任意3D编辑器(如Maya、3D Studio Max、Blender等)中完成。该步骤比较耗时,需要重新设置网格的UV坐标,使其对齐到第二步所创建的纹理集中的像素。对所有使用同一着色器的网格都要重复此步骤。
- 将第三步创建的材质赋给重新编辑后的网格 完成上述步骤后,还需要进行以下两个操作:用所有重新映射后的网格替换之前的网格,并禁用旧的网格;将第三步创建的材质赋给重新映射后的网格。
运行优化后的场景,我们可以看到,优化之前的SetPass calls是4,而优化后减少至1,在本例中Draw Call减少了75%。
在Unity 5中使用标准着色器时减少Draw Call
如前文所述,标准着色器会根据所用到的纹理改变执行速度和渲染方式。因此,如果材质的纹理使用同一标准着色器,就可以将材质合并。例如,合并所有只有颜色的网格、合并所有只有Albedo(反射率)纹理的网格等等。按照纹理整合好对象后,对于任意着色器都只需进行上述五个步骤进行优化,其中的着色器就是标准着色器的纹理字段。
经过优化后,可以看到Draw Call从91减少至22,约降低了75%。如果尽可能地合并网格,效果还会更好。
在Unity中自动减少Draw Call
本文作者Juan制作了插件Pro Draw Call Optimizer,该插件可以自动根据用到的着色器类型来整合对象,并自动对所有未优化的场景进行“加工”。另外,如果场景只用到Diffuse和Bumped Diffuse着色器,还可以使用Juan制作的免费版插件Pro Draw call Optimizer Light。
- 付费版插件Pro Draw Call Optimizer地址:https://www.assetstore.unity3d.com/en/#!/content/16538
- 免费版插件Pro Draw call Optimizer Light地址:https://www.assetstore.unity3d.com/en/#!/content/16888
原文链接:[http://www.pencilsquaregames.com... ss-calls-on-unity5/](http://www.pencilsquaregames.com... ss-calls-on-unity5/) 原文作者:Juan
转载请注明来源:Unity官方中文社区 (http://forum.china.unity3d.com/forum.php)。请勿私自更改任何版权说明信息。