NO Batch  ?

游戏场景中存在大量例子的时候,DrallCall的压力很大,但是遍历一遍之后发现,为啥一样的粒子特效竟然没有合并,why?经过很多测试后发现,如果把透明材质的修改为非半透明的,就可以合并,这就让我很奇怪了?Unity提供了材质动态合并的功能,虽然限制很多,但是对于透明材质的合并,Unity似乎给了一个很玄乎的答案:

Semitransparent shaders most often require objects to be rendered in back-to-front order for transparency to work. Unity first orders objects in this order, and then tries to batch them - but because the order must be strictly satisfied, this often means less batching can be achieved than with opaque objects.

这尼玛等于没说。。。。但是原因其实很明显:透明材质

透明材质

测试的时候发现:

1  带有透明材质的粒子如果把深度完全分开,那么相同材质的基于可以进行合并

2 把不同透明材质的渲染次序完全分开也可以进行合并

透明材质使用alpha blend的方式按摄像机距离从后向前进行渲染,如果对深度相同、渲染顺序相同的粒子进行渲染,Unity可能就完全按照乱序的方式进行渲染。但是修改深度或者渲染次序后,同样材质的粒子可能就会在相邻的次序进行渲染。 也就是说使用相同材质的物体需要在相邻的渲染队列中才会进行合并。那这样思路就很清晰,只需要对粒子的渲染次序或者深度进行适当的排序即可。

渲染次序

粒子一般是放在一起,修改深度可能不太现实,美术的妹子也不乐意,那OK ,只能修改渲染次序,存在两种情况:

(1)不同shader的材质,可以直接在shader中RenderQueue中定义,RenderQueue具体可以查看Unity官方定义:http://docs.unity3d.com/Manual/SL-SubShaderTags.html。一般来说透明材质是从3000开始,渲染的时候这个数值从小向大渲染(之前美术做的渲染次序全部在3000)。

(2) 相同shader不同贴图:这个我也没辙,只能通过Unity 属性面板中debug模式进行修改

经过场面的处理后,不同的材质使用不用的渲染次序,粒子的drallcall 就可以完全进行合并。

一些思考

(1)场景中渲染次序问题

其实Unity已经把场景中的物体区分为不同类型,如下图,但是在使用中还是需要注意很多。最好是在项目初期就会好好场景中可能用到的渲染次序分类。

(2)透明度交叉渲染(OIT)

粒子比较小,所以可能不存在交叉渲染的问题,但是对于透明物体而言,alpha blend模式下需要从后向前渲染,如果存在透明物体交叉的情况就很麻烦。如下图:

具体详情可以参考这篇文章

http://blog.csdn.net/candycat1992/article/details/41599167

对于和排序无关的透明渲染可以参考:

https://developer.nvidia.com/content/transparency-or-translucency-rendering

http://www.cnblogs.com/wubugui/p/5099418.html

Unity透明材质Batch的更多相关文章

  1. UE4成批处理透明材质

    项目中需要控制成批的物体的透明度,但是默认的时候他又不能是透明的,对,项目的要求就这么诡异. 然而却没有找到设置材质的BlendMode的功能,于是只有换了一种办法,物体需要透明时更换为透明材质,默认 ...

  2. Unity 烘焙材质到单一贴图的脚本

    原地址:http://www.cocoachina.com/gamedev/gameengine/2011/0406/2756.html 这个脚本由 CocoaChina 版主 “四角钱” 分享,可以 ...

  3. unity, particleSystem的batch优化

    一,单个光效的batch优化 理想状态下一个由若干粒子堆出来的光效只需要一至两个draw call: (1)至多使用alpha blend(垫底色)和additive(曝光)两个材质球,两shader ...

  4. [Unity菜鸟] 材质

    1. 材质定义: 2. 把材质都改成支持透明通道 因为物体太多了,比如树跟房子材质必须用不一样的.所以办法还是你得改每个材质的Shader,都改成支持透明通道的. 在Project的搜索窗口输入t: ...

  5. unity, 在材质上指定render queue

    材质球inspector面板在debug模式下可以看到Custom Render Queue一项: 其默认值为-1,表示使用相应shader的render queue设置. 也可以人为将其改为其它值, ...

  6. unity物理学材质Physic Material

    物理材料 切换到脚本   在物理学材料是用来调整摩擦和碰撞对象的反弹效应. 要创建物理材质,请从菜单栏中选择“ 资源”>“创建”>“物理材质 ”.然后将“物理材质”从“项目视图”拖动到场景 ...

  7. unity 模型 材质 贴图 关系;着色器属性

    模型包含 材质(Material),包括 [核心]着色器(Shader) 贴图和其他参数,贴图也算是一种参数 其他,如网格渲染器(Mesh Renderer).动画.坐标 一个材质可以看做为一个Sha ...

  8. Unity透明Shader

    Shader "Custom/Blocks" { Properties { _Color (,,,) _MainTex ("Albedo (RGB)", 2D) ...

  9. Unity标准材质官方教程合集

随机推荐

  1. WindowsForm菜单工具栏--2016年12月6日

    ContextMenuStrip 添加控件后可在其他空间属性中进行绑定 MenuStrip       设置热键:在编辑的时候输入(&F)       设置快捷键:选中菜单项--右键属性--S ...

  2. Python自动化之一对多

    一对多 建立一对多关系之后(也就是加了外键),会在字表里面多一个"外键字段_id"这个字段 查询 #_*_coding:utf-8_*_ from django.db import ...

  3. Visual Studio 2013 智能提示

    Visual Studio 2013中,智能提示功能突然用不了,查了一下,使用命令行重置VS的方法解决了这个问题.步骤如下: 开始菜单 -->所有程序-->Visual Studio 20 ...

  4. caffe初试(一)happynear的caffe-windows版本的配置及遇到的问题

    之前已经配置过一次caffe环境了: Caffe初试(一)win7_64bit+VS2013+Opencv2.4.10+CUDA6.5配置Caffe环境 但其中也提到,编译时,用到了cuda6.5,但 ...

  5. ASP.NET知识总结(7.状体保持)

    客户端的状态保持方案:ViewState.隐藏域.Cookies.控件状态.URL查询参数 服务端的状态保持方案:Session(会话).Application.Caching(缓存).DataBas ...

  6. sqlserver 中row_number,rank,dense_rank,ntile排名函数的用法

    1.row_number() 就是行号 2.rank:类似于row_number,不同之处在于,它会对order by 的字段进行处理,如果这个字段值相同,那么,行号保持不变 3.dense_rank ...

  7. 【Java EE 学习 17 下】【数据库导出到Excel】【多条件查询方法】

    一.导出到Excel 1.使用DatabaseMetaData分析数据库的数据结构和相关信息. (1)测试得到所有数据库名: private static DataSource ds=DataSour ...

  8. PCM数据格式,多少字节算一帧

    转自:http://blog.chinaunix.net/uid-9185047-id-3327302.html Somehow i remember that normally 2048 sampl ...

  9. 【Cocos2d-x游戏开发】细数Cocos2d-x开发中那些常用的C++11知识

    自从Cocos2d-x3.0开始,Cocos2dx就正式的使用了C++11标准.C++11简洁方便的特性使程序的可拓展性和可维护性大大提高,也提高了代码的书写速度. 下面我们就来一起学习一下Cocos ...

  10. codeforces泛做..

    前面说点什么.. 为了完成日常积累,傻逼呵呵的我决定来一发codeforces 挑水题 泛做.. 嗯对,就是泛做.. 主要就是把codeforces Div.1的ABCD都尝试一下吧0.0.. 挖坑0 ...