1994922 发表于 2016-11-7 11:38:21

在Unity5中减少Draw Call的方法

本文为大家分享Unity 5中标准着色器的简单概念,并分析如何减少Draw Call(Unity 5中显示为SetPass calls,下文的Draw Call皆表示SetPass calls)。
      标准着色器是基于物理的着色器,可以正确渲染各种光照条件下的效果,支持跨平台,拥有可以启用不同功能着色器的纹理字段。
   
      标准着色器会根据纹理字段所选用的纹理改变自身包含的功能,从而控制这个shader的执行速度。如下图,尽管两个材质使用同一个着色器,但仍有区别:

http://bbs.woxueyuan.com/data/attachment/forum/201607/15/160156c7v71aaf6h4h37a6.jpg

这两个着色器在渲染场景时是完全不同的(尽管都是“标准着色器”),因此如果想减少Draw Call,就要以完全不同的方式来处理这两个着色器。
      先介绍通用的减少Draw Call的方法,然后再讲解在Unity 5中使用标准着色器时如何减少Draw Call。
      
      手动减少Draw Call
      不论是Unity或其它引擎,减少Draw Call无非就是尽可能少用材质。
      所以减少材质基本上有以下几步:
1.按照所用的着色器类型对材质进行分类及整合。
2.将使用同一着色器的材质的纹理合并为纹理集。
3.创建一个材质,让其包含着色器及第二步创建的纹理集。
4.重新对用到该着色器的网格进行纹理映射以匹配纹理集中的纹理坐标。
5.将第三步创建的材质赋给重新编辑后的网格。

       第一步,按照所用的着色器类型对材质进行分类及整合
       尽量使用最简单的场景来说明,这里只有4个材质,每个材质都使用Bumped Diffuse着色器,如下图:

http://bbs.woxueyuan.com/data/attachment/forum/201607/15/160156xkofppiijyjjizlr.jpg

注意上图的SetPass calls是4。
      对于此场景要处理的材质如下图:

http://bbs.woxueyuan.com/data/attachment/forum/201607/15/160157h5d5mw5ym4l5cwcy.jpg
       第二步,将使用同一着色器的材质的纹理合并为纹理集
      这里每个着色器有两张纹理,一张基本纹理和一张Bumped Diffuse要用的法线纹理,所以需要的纹理贴图如下:

http://bbs.woxueyuan.com/data/attachment/forum/201607/15/160157zl9lgvcgldziwvkt.jpg

       将纹理保存到工程以供后续使用:

http://bbs.woxueyuan.com/data/attachment/forum/201607/15/160157h2sbdaipfdjzcdo5.jpg

第三步,创建一个材质,让其包含着色器及第二步创建的纹理集。
       创建材质,并设置好两个纹理和着色器(本例是“Bumped Diffuse”)如下图:

http://bbs.woxueyuan.com/data/attachment/forum/201607/15/160157k5i522h6hbqe51e6.jpg


第四步,重新对用到该着色器的网格进行纹理映射以匹配纹理集中的纹理坐标。
      这一步可在任意3D编辑器中完成(Maya、3D studio 、Max 、Blender 等)。
      该步骤比较耗时,需要重新设置网格的UV坐标以对齐到第二步所创建的纹理集中的像素。如下图:

http://bbs.woxueyuan.com/data/attachment/forum/201607/15/160159ffj53qfwnd9nwfdw.jpg

      对所有使用同一着色器的网格重复以上步骤。
      第五步,将第三步创建的材质赋给重新编辑后的网格。
      还要进行以下两个步骤:
      用所有重新映射后的网格替换之前的网格,并禁用旧的网格。
      将第三步创建的材质赋给重新映射后的网格。
      如下图:


http://bbs.woxueyuan.com/data/attachment/forum/201607/15/160159svoiglfshfyflczx.jpg


运行效果如下图:

http://bbs.woxueyuan.com/data/attachment/forum/201607/15/160200q0tw02wotuq424ij.jpg

      回到第一步,优化之前的SetPass calls是4,而优化后减少至1,本例中Draw Call减少了75%。
   在Unity 5中使用标准着色器时减少Draw Call
      如之前所说,标准着色器会根据所用到的纹理变得更快或更慢,与此同时渲染方式也会不同。所以如果材质的纹理使用同一标准着色器,就可以将材质合并。例如,合并所有只有颜色的网格、合并所有只有Albedo(反射率)纹理的网格等等。按照纹理整合好对象后对于任意着色器都只需进行上面五个步骤进行优化,其中的着色器就是标准着色器的纹理字段。

http://bbs.woxueyuan.com/data/attachment/forum/201607/15/160200jhue9tyyz9y199et.jpg

      可以看到Draw Call从91减少至22,约降低了75%,如果尽可能的合并网格效果还可以更好。
       在Unity中自动减少Draw Call
      本文作者Juan制作了插件Pro Draw Call Optimizer,可以自动根据用到的着色器类型来整合对象,并自动对所有未优化的场景进行“加工”。另外如果场景只用到Diffuse和Bumped Diffuse着色器,还可以使用Juan制作的免费版插件Pro Draw call Optimizer Light。为了解决广大Unity3D游戏开发爱好者的学费问题,龙图教育特别推出分期付款和先学习后付款的特色优惠,并可以进行试听。入学就签订就业协议,毕业后直接进入校企合作企业进行工作。

温馨提示:如需预约免费试听课程,请将姓名,联系方式,以及预约的课程发送至以下手机、QQ、或微信,如有疑问也可拨打热线电话。报名咨询热线:15112251330   QQ:1358148771   微信:1358148771


页: [1]
查看完整版本: 在Unity5中减少Draw Call的方法