本文为大家分享Unity 5中标准着色器的简单概念,并分析如何减少Draw Call(Unity 5中显示为SetPass calls,下文的Draw Call皆表示SetPass calls)。
标准着色器是基于物理的着色器,可以正确渲染各种光照条件下的效果,支持跨平台,拥有可以启用不同功能着色器的纹理字段。
标准着色器会根据纹理字段所选用的纹理改变自身包含的功能,从而影响这个Shader的执行速度。尽管他们都是使用的标准着色器,但***终生成的着色器是不同的,如下图:
这两个着色器在渲染场景时是完全不同的(尽管都是“标准着色器”),因此如果想减少Draw Call,就要以完全不同的方式来处理这两个着色器。
先介绍通用的减少Draw Call的方法,然后再讲解在Unity 5中使用标准着色器时如何减少Draw Call。
手动减少Draw Call
不论是Unity或其它引擎,减少Draw Call无非就是尽可能少用材质。
所以减少材质基本上有以下几步:
1. 按照所用的着色器类型对材质进行分类及整合。
2. 将使用同一着色器的材质的纹理合并为纹理集。
3. 创建一个材质,让其包含着色器及第二步创建的纹理集。
4. 重新对用到该着色器的网格进行纹理映射以匹配纹理集中的纹理坐标。
5. 将第三步创建的材质赋给重新编辑后的网格。
***步按照所用的着色器类型对材质进行分类及整合
尽量使用***简单的场景来说明,这里只有4个材质,每个材质都使用Bumped Diffuse着色器,如下图:
注意上图的SetPass calls是4。
对于此场景要处理的材质如下图:
第二步将使用同一着色器的材质的纹理合并为纹理集
这里每个着色器有两张纹理,一张基本纹理和一张Bumped Diffuse要用的法线纹理,所以需要的纹理贴图如下:
第二步将使用同一着色器的材质的纹理合并为纹理集
这里每个着色器有两张纹理,一张基本纹理和一张Bumped Diffuse要用的法线纹理,所以需要的纹理贴图如下:
第三步创建材质,让其包含着色器及第二步创建的纹理集
创建材质,并设置好两个纹理和着色器(本例是“Bumped Diffuse”)如下图:
第四步重新对网格进行纹理映射以匹配纹理集中的坐标
这一步可在任意3D编辑器中完成(Maya、3D studio 、Max 、Blender 等)。
该步骤比较耗时,需要重新设置网格的UV坐标以对齐到第二步所创建的纹理集中的像素。如下图:
对所有使用同一着色器的网格重复以上步骤。
第五步将第三步创建的材质赋给重新编辑后的网格
还要进行以下两个步骤:
1. 用所有重新映射后的网格替换之前的网格,并禁用旧的网格。
2. 将第三步创建的材质赋给重新映射后的网格。
如下图:
运行效果如下图:
回到***步,优化之前的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。
发表评论
发表评论: