unity5中减少Draw Calls(SetPass Calls)
 
我一直工作于unity5支持的Standard Shader(标准着色器)上,并且做了一些关于如何有效地减少draw call的测试,在Unity5全新的standard shader上,实际成果相当可观。
 
我们先科普一下standard shader。Standard Shader是个基于物理的着色器, 物理渲染和当今的主流光照计算最大的区别就是,当今的lambert blinn phone基本上是基于模拟的模型,就是尽可能的去模拟我们看上去的物体反射的颜色,甚至可以说是拍脑袋的模型,用于欺骗我们的眼睛,而基于物理的光照计算则是依据了光线传播的物理特性,更加贴近于真是的光照情况,虽然在实现上还是用了一些近似计算。所以物理渲染在表现自然界的物体时尤其的看上去更加真实。
 
这是个小视频介绍了下standard shader可以实现的效果,官方的U5Shader视频
 
 
 
这个standard shader“变化”是变得更快还是更慢,取决于贴图你使用的texture slots。尽管如此,这两种着色器是不同的(即使他们使用的都是standard shader):

<ignore_js_op>

这两个shader(即使他们是”Standard shader”)
 
当渲染场景时他们是完全不同的shader,因此如果我们想减少一些draw call(setpass call),必须采用完全不同的处理方式。
 
在谈到如何在Unity5减少draw call之前,我将探讨无论shader是否被使用时怎样减少draw calls,然后讨论在Unity5中使用Standard shader减少draw calls.
 
 
在Unity中用手动方式降低Draw Call
 
如果我们想减少draw call,在Unity中或者在其他引擎上,可以尽量减少使用的material(材质)。基本上,这些可以还原为这些简单的步骤:
 
1.整理所有的material并且通过他们的shader类型收集他们
2.第二步:对于使用相同shader的材质,将他们的贴图做成一个图集(Atlas)
3.创建一个material,它将包含shader和图集(Atlas)
4.网格的所有UV重新映射,使用Shader适配图集的坐标
5.用映射的网格创建出步骤3的material
 
第一步:整理所有的material,并收集它们的shader类型
我打算用一个简单的场景解释,这个场景所有网格使用的是相同类型但不同texture的material.
在我们的情况下,我们将使用这个场景(其中包含4个material,其中每一个都具有Bumped Diffuse shader):
    <ignore_js_op>          
注意SetPass calls:4         
  
所以我们要对这一场景的这些material进行处理:   
 
第二步:对于使用相同shader的材质,将他们的贴图做成一个图集(Atlas)
在我们的例子中,我们有2个texture,每一个着色的漫反射贴图使用一个正常的法线贴图和一个基本texture,所以我们需要做的是将这两个texture这样设置:         
   <ignore_js_op> 
保存这些texture在项目视图中,我们一会儿将需要它们:
 
<ignore_js_op>             
        
第三步:创建一个material,它将包含shader和图集(Atlas)
创建一个material,并将两张贴图和Shader(Bumped Diffuse)赋予给材质:      
   <ignore_js_op>             
 
第四步:网格的所有UV重新映射,使用Shader适配图集的坐标
这个修改可以用任何建模软件(Maya/ 3D studio / Max / Blender /等)来操作。
这是很无聊的又很必要的步骤,包括修改网格的UV坐标并且使它们适配texture图集(我们第二步创建的texture图集)。
所以我们要做的是,将每一个UV坐标设置为[ 0,0–1,1 ],我们可以将他们重新定位在一个[ 0,0-1,1 ]的较小的子范围中,这样就与步骤2中创造的图集相匹配。
<ignore_js_op>            
接着……我们为每个网格共享相同的shader。            
 
第五步:用你映射的网格创建出步骤3的material         
 
我们基本上完成了!我们还有几步要做:            
1。选择你所有的UV映射网格,用他们替换旧网格的位置并且停用旧的网格
        
2。将步骤3创造的材质赋予所有的UV映射网格。   
<ignore_js_op>          
 
到了这里,我们就结束了!,现在让我们点击play看看:
            
<ignore_js_op>      
在优化前,如果你回到步骤1,我们有4个SetPass call,现在优化已经完成,我们最终就有1个 SetPass call!太惊人了!在这种情况下,它的75%draw call减少了。            
在Unity5中减少绘制调用的标准着色        
在这里,你应该知道多了解些在standard shader上优化过程是如何做的。我在开头写了,standard shader内部“变化”和越来越快/慢,取决于你使用的texture slots。就是说,我们必须收集我们对象的material,如果他们使用了texture也使用的Standard shader。
通过使用的texture归类这些对象,我们只需要遵循我们用于所有shader的以下几个步骤:
            
1.整理所有的material并且通过他们的shader类型收集他们
2.第二步:对于使用相同shader的材质,将他们的贴图做成一个图集(Atlas)
3.创建一个material,它将包含shader和图集(Atlas)
4.网格的所有UV重新映射,使用Shader适配图集的坐标
5.用映射的网格创建出步骤3的material
           
这是我为测试创建的一个小场景:
<ignore_js_op>          
如果你比较原始场景的draw call(91)和优化后场景的draw call(22),你可以看到,有75%draw call减少了!,太惊人了!   
此外,如果你可以尝试尽可能多的组合网格,这也有很多帮助!。            

在unity5中减少Draw Calls(SetPass Calls)[转]的更多相关文章

  1. Draw Call(Unity 5中显示为SetPass calls

    Draw Call(Unity 5中显示为SetPass calls

  2. 12个Unity5中优化VR 应用的技巧

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50176429 作者:car ...

  3. Unity5中的MetaPass

    前些天烘焙lightmap的时候发现用自己写的Shader的模型在烘焙时候不会烘焙效果不对,它不会产生对周围物体的间接光照,但是我放到了unity4.x中就是没问题的.查了一番,发现Unity5中加了 ...

  4. Unity5中叹为观止的实时GI效果

    http://www.manew.com/thread-43970-1-1.html 今天为大家分享unity与Alex Lovett共同使用unity5制作的Shrine Arch-viz Demo ...

  5. CNN中减少网络的参数的三个思想

    CNN中减少网络的参数的三个思想: 1) 局部连接(Local Connectivity) 2) 权值共享(Shared Weights) 3) 池化(Pooling) 局部连接 局部连接是相对于全连 ...

  6. Unity5中新的Shader体系简析

    一.Unity5中新的Shader体系简析 Unity5和之前的书写模式有了一定的改变.Unity5时代的Shader Reference官方文档也进一步地变得丰满. 主要需要了解到的是,在原来的Un ...

  7. 在WPF中减少逻辑与UI元素的耦合

    原文:在WPF中减少逻辑与UI元素的耦合             在WPF中减少逻辑与UI元素的耦合 周银辉 1,    避免在逻辑中引用界面元素,别把后台数据强加给UI  一个糟糕的案例 比如说主界 ...

  8. Unity5中WebGL平台封装的一些技巧

    最近在接触unity的WebGL平台,其实这个平台作为Web Player的替代品,已经能满足大部分的开发需求,而且不需要额外的插件支持,确实方便了不少,但开发中依旧遇到了不少问题,在这里记录和共享一 ...

  9. 如何在代码中减少if else语句的使用

    前言 代码中嵌套的if/else结构往往导致代码不美观,也不易于理解.面向过程的开发中代码有大量的if else,在java中可以用一些设计模式替换掉这些逻辑,那么在js中是否也有类似的方法用来尽可能 ...

随机推荐

  1. [自娱自乐] 4、超声波测距模块DIY笔记(四)——终结篇·基于C#上位机软件开发

    前言 上一节我们已经基本上把超声波硬件的发射和接收模块全部做好了,接下来我们着手开发一个软硬结合的基于C#的平面定位软件! 目录 一.整体思路 二.效果提前展示 2-1.软件部分展示 2-2.硬件部分 ...

  2. phpMyAdmin导入文件突破2M大小

    一:通过phpinfo.php找到php.ini在哪个位置,注意,它并不一定在phpMyAdmin路径下: 二:修改upload_max_filesize,post_max_size,以及memory ...

  3. DataGridView绑定复杂实体(属性本身又是实体)

    今天我们来讨论下一个实体中某个属性又是实体的类型的集合绑定到DataGridView上的问题. 先来写一个Student类 public class Student { public int Stud ...

  4. phoneGap2.9+eclipse开发环境和helloword案例

    不同机器安装和使用各不相同,这里也只是记录一下自己机器上面的使用过程. android安装环境前面的文章有些,这里不再说,直接上phoneGap的过程.因为phoneGap2.9.1需要安装nodej ...

  5. JavaScript 中的 this ,看着一篇就够了

    tip 在 js 中,this 这个上下文总是变化莫测,很多时候出现 bug 总是一头雾水,其实,只要分清楚不同的情况下如何执行就 ok 了. 全局执行 首先,我们在全局环境中看看它的 this 是什 ...

  6. paip.web数据绑定 下拉框的api设计 选择框 uapi python .net java swing jsf总结

    paip.web数据绑定 下拉框的api设计 选择框 uapi  python .net java swing jsf总结 ====总结: 数据绑定下拉框,Uapi 1.最好的是默认绑定..Map(k ...

  7. android: 将程序运行到手机上

    8.3.1   将程序运行到手机上 不必我多说,首先你需要拥有一部 Android 手机.现在 Android 手机早就不是什么稀罕 物,几乎已经是人手一部了,如果你还没有话,抓紧去购买吧. 想要将程 ...

  8. 使用Facebook的SDK判斷來訪者是否已經按讃并成為本站粉絲團的成員

    今天公司裡要做活動,其中有一項活動內容是要求來訪者按一下facebook粉絲團的讃,按了讃之後贈送現金.Facebook被墻大家眾所周知,在百度搜了一下發現因為被墻的原因導致國內涉及到Facebook ...

  9. “代理XP”组件已作为此服务器安全配置的一部分被关闭的解决办法

    代理XP”组件已作为此服务器安全配置的一部分被关闭.系统管理员可以使用sp_configure来启用“代理XP”.有关启用“代理XP”的详细信息,请参阅SQL Server联机丛书中的“外围应用配置器 ...

  10. Socket原理与编程基础(转)

    一.Socket简介 Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换. 几个定义: (1)IP地址:即依照TCP/IP协议分配给本地主机的 ...