Unity透明材质Batch

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

时间: 2024-10-10 00:28:47

Unity透明材质Batch的相关文章

Unity 透明窗体的创建

原文地址:https://alastaira.wordpress.com/2015/06/15/creating-windowless-unity-applications/ 蛮牛地址:http://www.manew.com/thread-43230-1-1.html 该效果只针对Windows平台.结合摄像机的OnRenderImage事件和一些Windows底层API调用来实现该效果. 首先需要一个透明的Shader,我这直接使用系统的. 然后创建一个C#的脚本 TransparentWi

[Unity菜鸟] 材质

1. 材质定义: 2. 把材质都改成支持透明通道 因为物体太多了,比如树跟房子材质必须用不一样的.所以办法还是你得改每个材质的Shader,都改成支持透明通道的. 在Project的搜索窗口输入t: material 然后材质就都出来了. 然后全部选定,把shader 改成Particle/Alpha blended,全选改不了是因为你全选的材质里面存在着用不同shader的材质 [Unity菜鸟] 材质

unity程序材质ProceduralMaterial使用

有些效果是用substance的材质,但是材质上的属性无法用平常的Material方法调用,需要ProceduralMaterial去调用, using UnityEngine; using System.Collections; public class TestProceduralMaterial : MonoBehaviour { public GameObject TestCube; public Texture2D tex; public ProceduralMaterial mate

Unity自发光材质制作——做游戏里的液晶显示屏,荧光对象可以用到

材质以及效果都是在Unity里实现的,纹理是在Photoshop里做的,所以也会说到Photoshop软件的操作方法,自发光或者是荧光效果还不错

unity, 在材质上指定render queue

材质球inspector面板在debug模式下可以看到Custom Render Queue一项: 其默认值为-1,表示使用相应shader的render queue设置. 也可以人为将其改为其它值,例如2000(opaque)或3000(transparent)等. 但严重不建议这样做,因为这使得材质的渲染顺序与shader不一致,容易让人困惑.

Shader-应用V&F实现透明材质

看到风宇冲实现的地球很帅.他写的这个程序很精妙,将地球和云的颜色做一个插值,作为此像素的颜色值,很妙.先膜拜一下大神嘛! http://blog.sina.com.cn/s/blog_471132920101d6xb.html 不过,我今天写的shader也是实现相同的效果,咱的思路就很常规:地球作为不透明物体,先渲染.云层作为透明体后渲染.废话不多说开始! Earth.shader Shader "Custom/Earth" { Properties { _MainTex (&quo

Unity反射材质制作——镜中花,水中月,但是非镜面效果哟

只需导入两张纹理图片,然后在Unity中做相应设置就可以了,果然这个软件很强大,都不带写代码的.做游戏特效越来越简单,是好事,还是坏事

unity物理学材质Physic Material

物理材料 切换到脚本 在物理学材料是用来调整摩擦和碰撞对象的反弹效应. 要创建物理材质,请从菜单栏中选择“ 资源”>“创建”>“物理材质 ”.然后将“物理材质”从“项目视图”拖动到场景中的“ 碰撞”中. 属性 属性: 功能: 动态摩擦 已经移动时使用的摩擦力.通常是从0到1的值.零值感觉像冰一样,值1会使它非常快地停下来,除非大量的力或重力推动物体. 静摩擦力 当物体静止在表面上时使用的摩擦力.通常是0到1之间的值.零值感觉像冰,值1会使对象移动变得非常困难. 反弹力 表面有多么有弹性?值0不

unity 透明图片 Button 按钮 实现 点击透明区域时无效

Image image = GetComponent<Image>(); image.alphaHitTestMinimumThreshold = 0.1f; 图片要求,  透明图片设置为精灵图, 不透明区域要填充整张图片,    当图片不符合要求时  , 可以用精灵图片的剪裁工具, 处理  . 原文地址:https://www.cnblogs.com/G993/p/11679041.html