https://docs.unity3d.com/Manual/GPUInstancing.html
归纳总结:
一,快速使用U3D 的GPU 实例化功能
1,选择一个shader,勾选 enable gpu instancing,这个shader将用于你的将要使用gpu instancing的物体
2,U3D自动对使用了这个shader的物体做gpu instancing
比如渲染一堆网格相同,位置不同的物体
这时候做不到让每个物体有不同颜色,或不同的缩放,不同的旋转
到此,最简单的gpu instancing功能就实现了,如果想要更多效果和控制,那么接下来看二,三两步
二,添加个性化
修改shader和应用程序,可以让实例化的每个物体拥有不同的颜色,或不同缩放,或不旋转
1,修改shader,
1.1 若是surface shader,只需三行宏定义,如下,指定颜色属性为每个实例都不相同
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_DEFINE_INSTANCED_PROP(fixed4, _Color)
UNITY_INSTANCING_BUFFER_END(Props)
1.2若是vertex/fragment shader,则需要在不同地方写很多条宏定义
2,修改脚本,在应用程序脚本中为每个物体的materialPropertyblock设置不同的参数,如颜色等,U3D会自动收集这些个性化数据,最后在绘制时一次性提交给GPU(即在drawmesh或drawInstancedMesh时),如下:
MaterialPropertyBlock props = new MaterialPropertyBlock(); MeshRenderer renderer; foreach (GameObject obj in objects) { float r = Random.Range(0.0f, 1.0f); float g = Random.Range(0.0f, 1.0f); float b = Random.Range(0.0f, 1.0f); props.SetColor("_Color", new Color(r, g, b)); renderer = obj.GetComponent(); renderer.SetPropertyBlock(props); }
如果还不满意,那么可以进行第三步
三,进阶
自己调用绘制API: Graphics.DrawMeshInstanced,替换U3D的默认调用Graphics.DrawMesh