设为首页收藏本站

微软Hololens全息现实网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

一键登录:

查看: 1195|回复: 0

渲染效率优化 在Unity 5中如何减少Draw Call

[复制链接]
发表于 2016-3-10 08:52:38 | 显示全部楼层 |阅读模式

本文为大家分享Unity 5中标准着色器的简单概念,并分析如何减少Draw Call(Unity 5中显示为SetPass calls,下文的Draw Call皆表示SetPass calls)。标准着色器是基于物理的着色器,可以正确渲染各种光照条件下的效果,支持跨平台,拥有可以启用不同功能着色器的纹理字段。 正文开始前先来看一段标准着...

本文为大家分享Unity 5中标准着色器的简单概念,并分析如何减少Draw Call(Unity 5中显示为SetPass calls,下文的Draw Call皆表示SetPass calls)。标准着色器是基于物理的着色器,可以正确渲染各种光照条件下的效果,支持跨平台,拥有可以启用不同功能着色器的纹理字段。


正文开始前先来看一段标准着色器效果的视频:

标准着色器会根据纹理字段所选用的纹理改变自身包含的功能,从而影响这个Shader的执行速度。尽管他们都是使用的标准着色器,但最终生成的着色器是不同的,如下图:

66cea2a8ce1a310e16394866d3dc306b.jpg


这两个着色器在渲染场景时是完全不同的(尽管都是“标准着色器”),因此如果想减少Draw Call,就要以完全不同的方式来处理这两个着色器。
先介绍通用的减少Draw Call的方法,然后再讲解在Unity 5中使用标准着色器时如何减少Draw Call。


手动减少Draw Call不论是Unity或其它引擎,减少Draw Call无非就是尽可能少用材质。

所以减少材质基本上有以下几步:按照所用的着色器类型对材质进行分类及整合。将使用同一着色器的材质的纹理合并为纹理集。创建一个材质,让其包含着色器及第二步创建的纹理集。重新对用到该着色器的网格进行纹理映射以匹配纹理集中的纹理坐标。将第三步创建的材质赋给重新编辑后的网格。


第一步  按照所用的着色器类型对材质进行分类及整合

尽量使用最简单的场景来说明,这里只有4个材质,每个材质都使用Bumped Diffuse着色器,如下图:

95e81c88c1745ce6a7c7f58a1a62b3f7.jpg


注意上图的SetPass calls是4。

对于此场景要处理的材质如下图:

fb010781fefc157e35067883daf1936b.jpg


第二步  将使用同一着色器的材质的纹理合并为纹理集

这里每个着色器有两张纹理,一张基本纹理和一张Bumped Diffuse要用的法线纹理,所以需要的纹理贴图如下:


59a9afa8f1d99ae18b23db71aff57943.png


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

6c0acea5f9b9cf1189ae51c0ed22fec3.png


第三步  创建材质,让其包含着色器及第二步创建的纹理集

创建材质,并设置好两个纹理和着色器(本例是“Bumped Diffuse”)如下图:

24e38905b9c5e20cfcd60d5a22e972df.jpg


第四步  重新对网格进行纹理映射以匹配纹理集中的坐标

这一步可在任意3D编辑器中完成(Maya、3D studio 、Max 、Blender 等)。

该步骤比较耗时,需要重新设置网格的UV坐标以对齐到第二步所创建的纹理集中的像素。如下图:

95fc5555672a113b4d6456334c650ddf.png


对所有使用同一着色器的网格重复以上步骤。

第五步  将第三步创建的材质赋给重新编辑后的网格

还要进行以下两个步骤:用所有重新映射后的网格替换之前的网格,并禁用旧的网格。将第三步创建的材质赋给重新映射后的网格。
如下图:

13609bbd84af53e9bc5742392178460d.png


运行效果如下图:

c87fa2d004e20dbce09adbc8d852d2e5.jpg


回到第一步,优化之前的SetPass calls是4,而优化后减少至1,本例中Draw Call减少了75%。

在Unity 5中使用标准着色器时减少Draw Call



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



使用标准着色器的场景优化前后对比图如下:

f61dd51c617ab0f5d2f0daef5d55f1fd.png


可以看到Draw Call从91减少至22,约降低了75%,如果尽可能的合并网格效果还可以更好。



在Unity中自动减少Draw Call本文作者Juan制作了插件Pro Draw Call Optimizer,可以自动根据用到的着色器类型来整合对象,并自动对所有未优化的场景进行“加工”。另外如果场景只用到Diffuse和Bumped Diffuse着色器,还可以使用Juan制作的免费版插件Pro Draw call Optimizer Light。



36c9824f9af329d0e521a8e420774d54.png                  





(欢迎加入官方QQ讨论群433190386)   





上一篇:谷歌商店官网直销自家的Cardboard 还有两家其它公司VR设备
下一篇:Steam VR平台发布新作 心理惊悚游戏《暮光小镇》令人不寒而栗
*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Hololens全息现实网 ( 京ICP备15026232号   点击这里给我发消息

GMT+8, 2018-10-22 19:10 , Processed in 0.668834 second(s), 38 queries .

Powered by Hololens全息现实网 X3.2

© 2001-2017 Hololens全息现实网

快速回复 返回顶部 返回列表