赞
踩
使用unity内置的批处理功能可以起到很好的性能优化效果。
批处理分为静、动态两种
静态批处理效果最好条件要求最简单,但要注意被标记为静态批处理的物体不允许改变位置。由于光照bake的原因,也会导致静态物体的阴影信息会烘焙到受影响的物体贴图上,所以从效果上也不应该再被移动。
【使用条件&步骤】
然而真实情况下我们并不能把所有物体都设置成静态,这时候就需要使用动态批处理了。动态批处理是满足条件后自动触发的。
【使用条件&步骤】
- 预处理区添加宏:#pragma multi_compile_instancing
- 顶点着色器数据结构尾部添加 UNITY_VERTEX_INPUT_INSTANCE_ID
- 片元着色器数据结构尾部添加UNITY_VERTEX_INPUT_INSTANCE_ID
- 顶点着色器头部添加UNITY_SETUP_INSTANCE_ID(v); UNITY_TRANSFER_INSTANCE_ID(v,o);
- 片元着色器头部添加UNITY_SETUP_INSTANCE_ID(i);
以下面shader为例
Shader"Custom/myShader"{
// 参数区
Properties{
...
}
// shader区
SubShader{
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// 1. 添加instancing 宏
#pragma multi_compile_instancing
struct a2v{
// 参数...
// 2. 在顶点输入结构的末尾添加,用于从gpu中获取instance id并传入顶点着色器
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f{
// 参数...
// 3. 在片元输入结构的末尾加入,用于将instance id传入片元着色器
UNITY_VERTEX_INPUT_INSTANCE_ID
};
v2f vert(a2v v){
v2f o;
// 4. 顶点着色器处理。 从输入结构体v中读取Instance_ID并输出给片元找着色器
UNITY_SETUP_INSTANCE_ID(v);
UNITY_TRANSFER_INSTANCE_ID(v,o);
// 逻辑...
return o;
}
fixed4 frag(v2f i):SV_Target{
// 5. 获取并处理instance id
UNITY_SETUP_INSTANCE_ID(i);
// 逻辑...
}
ENDCG
}
}
}
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。