U3D 文档 GPU INSTANCING

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<MeshRenderer>();
   renderer.SetPropertyBlock(props);
}

如果还不满意,那么可以进行第三步

三,进阶

自己调用绘制API: Graphics.DrawMeshInstanced,替换U3D的默认调用Graphics.DrawMesh

原文地址:https://www.cnblogs.com/timeObjserver/p/13168023.html