码迷,mamicode.com
首页 > 其他好文 > 详细

U3D 文档 GPU INSTANCING

时间:2020-06-20 13:26:35      阅读:45      评论:0      收藏:0      [点我收藏+]

标签:mesh   调用   unity3   define   and   绘制   定义   graph   ace   

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

 

U3D 文档 GPU INSTANCING

标签:mesh   调用   unity3   define   and   绘制   定义   graph   ace   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!