然而,默认的gpu instancing只能支持相同材质,这在使用时会很不方便,有时候可能仅仅想要修改材质的某个属性,例如这里修改不同球体的颜色,会导致instancing失效: 我们可以使用MaterialPropertyBlock来避免修改颜色时创建出新的材质: MaterialPropertyBlock properties = new MaterialPropertyBlock(); properties.SetColor( "_Colo...
MaterialPropertyBlockprops=newMaterialPropertyBlock();MeshRendererrenderer;props.SetColor("_Color",newColor(r,g,b));renderer=obj.GetComponent<MeshRenderer>();renderer.SetPropertyBlock(props);//不要在MaterialPropertyBlock中使用未经实例化的属性(即未在shader中声明为instanced的属性) (4)GPU Instancing不能...
SRP Batcher 最主要的适用场景是,当场景中有非常多的 Material,但这些大量的 Material 只采用了少数几种 Shader,或者说 Shader 变体比较少。和GPU Instance是冲突的,SRP优先级高。 4.GPU Instance GPUInstance原理贴一下 对于使用 同一网格和同一材质的物体们,它使用少量的渲染调用(DrawCall),渲染同一网格的多个副本...
要为粒子系统启用 GPU 实例化,必须在粒子系统的 Renderer 模块中启用 Enable GPU Instancing 复选框。 在Renderer 模块中启用粒子系统 GPU 实例化的选项 Unity 带有一个支持 GPU 实例化的内置粒子着色器,但默认的粒子材质不使用该着色器,因此必须更改此设置以使用 GPU 实例化。支持 GPU 实例化的粒子着色器名为 P...
instanceMaterial.SetBuffer("positionBuffer", positionBuffer);//RenderGraphics.DrawMeshInstancedIndirect( instanceMesh,0, instanceMaterial,newBounds(Vector3.zero,newVector3(100.0f,100.0f,100.0f)), argsBuffer); } shader需要额外定制,这点比较蛋疼。如果换成standard读不到positionBuffer这种结构。
请注意,在通常情况下(不使用实例化着色器,或者不是每个实例的属性),由于 MaterialPropertyBlock 中的值不同,绘制调用批次会被破坏。 要使这些更改生效,必须启用 GPU 实例化。为此,请在 Project 窗口中选择您的着色器,然后在 Inspector 中勾选Enable Instancing复选框。
现在5.6里面相当于你不用的话都可以被strip掉。策略很简单,build player的时候会去分析你build的场景。用了这个shader的material,只要用了任意一个,Instancing的variant就会被包含在最后的里面。在Graphics settings里面,这些都放在一起会有一个全局的控制。你可以把它强制给strip掉,这样最终出来的就不支持Instancing。
最近将GPU Instancing应用在游戏中,遇到了一些坑和大家分享一下,我们用的版本是unity2017。前面说了GPU Instancing目前适合游戏中的草、石头等元素较多的地方。 首先需要开发一个刷地表的编辑器,试想一下如果场景上的草每个都要美术手动的去摆这得多麻烦啊,如下图所示,根据网格和材质动态的在地形上刷地表。
一、为什么要使用GPU Instancing? 以往我们优化cpu的时候,为了降低Drawcall的消耗,我们通常采用静态批处理,动态批处理等技术,然而这也是有弊端的。通常一个大的场景中,存在大量相同的植被等物件,静态批处理后,对内存的增加是非常大的,动则就是几十兆的内存。而动态批处理,对于合批要求挺多的,同时可能存在,动态合批消...
自定义Shader兼容GPU Instancing 首先,定义PerMaterial Uniform block时,要使用INSTANCING相关的宏UNITY_INSTANCING_BUFFER_START,UNITY_INSTANCING_BUFFER_END和UNITY_DEFINE_INSTANCED_PROP。这些宏的作用是将Uniform block定义成数组。需要注意的是,只有当同一个材质下面的不同Instance存在逐Instance不同的属性时,才需要将...