注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

重新出发的阿赵

阿赵的博客

 
 
 

日志

 
 

GPU instancing介绍  

2017-10-03 18:11:04|  分类: Unity教程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
从Unity5.4开始,多了一个叫做GPU instancing的功能。这个功能是做什么用的呢?下面做一个小例子来说明一下:
 还是之前做 MaterialPropertyBlock的例子,在屏幕上面做了很多的cube,然后随机给颜色,使用MaterialPropertyBlock的方式设置颜色值。
GPU instancing介绍 - 阿赵 - 重新出发的阿赵
 可以看到,正常情况下,在改变完颜色之后,Batches有75个,而SetPass calls有75个。

下面换成GPU instancing的做法,同样的效果,可以看看数据:
GPU instancing介绍 - 阿赵 - 重新出发的阿赵
和之前完全一样的视觉效果,但Batches和SetPass calls都变成只有11了。

这是怎么做到的呢?
首先 ,我们必须是使用MaterialPropertyBlock来设置材质的属性,因为如果用传统的设置颜色,会把材质生成多个实例,这样就没有办法合并了。使用MaterialPropertyBlock由于从始至终只有一个material,所以它们才可以合并。
然后,需要特殊的shader来配合工作。在Unity5.4和5.5版本,都可以看到在创建shader的时候,多了一个选项Standard Surface Shader(Instanced)。这个shader类型就是支持GPU Instancing的。到了Unity5.6这个选项已经消失了,因为默认创建的Standard Surface Shader已经支持GPU Instancing了。
GPU instancing介绍 - 阿赵 - 重新出发的阿赵
当然了,我们不可能每个地方都用 Standard Surface Shader这种消耗特别大的shader,所以我们也可以手动的修改自己写的shader,官方的文档里面也有说明:
#pragma multi_compile_instancingUse this to instruct Unity to generate instancing variants. It is not necessary for surface Shaders.
UNITY_VERTEX_INPUT_INSTANCE_IDUse this in the vertex Shader input/output structure to define an instance ID. See SV_InstanceID for more information.
UNITY_INSTANCING_CBUFFER_START(name) /UNITY_INSTANCING_CBUFFER_ENDEvery per-instance property must be defined in a specially named constant buffer. Use this pair of macros to wrap the properties you want to be made unique to each instance.
UNITY_DEFINE_INSTANCED_PROP(float4, _Color)Use this to define a per-instance Shader property with a type and a name. In this example, the _Color property is unique.
UNITY_SETUP_INSTANCE_ID(v);Use this to make the instance ID accessible to Shader functions. It must be used at the very beginning of a vertex Shader, and is optional for fragment Shaders.
UNITY_TRANSFER_INSTANCE_ID(v, o);Use this to copy the instance ID from the input structure to the output structure in the vertex Shader. This is only necessary if you need to access per-instance data in the fragment Shader.
UNITY_ACCESS_INSTANCED_PROP(color)Use this to access a per-instance Shader property. It uses an instance ID to index into the instance data array.
举例说,我们可以在shader里面添加:
UNITY_INSTANCING_CBUFFER_START(Props)
UNITY_DEFINE_INSTANCED_PROP(fixed4, _Color) // Make _Color an instanced property (i.e. an array)
UNITY_INSTANCING_CBUFFER_END
让它支持GPU Instancing。

在Unity5.4和5.5版本,只要你的Shader支持,自动就会开启GPU Instance。到了Unity5.6,在材质选项里面会多了一个勾选:
GPU instancing介绍 - 阿赵 - 重新出发的阿赵
这是一个开关。假如你不勾选,就算你的shader是支持的,GPU Instance功能也不会生效。
 
  评论这张
 
阅读(68)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017