Jim's GameDev Blog

Dynamic Batching 失效

2018-2-7

Unity 的 Dynamic Batching 在一定的条件下才会被触发,在文档中有详细的说明。最近又遇到一种情况,会导致 Dynamic Batching 失效。Shader 中没有使用应用程序传入的顶点坐标,也会导致 Dynamic Batching 失效,比如下面的 billboard 代码。

struct appdata
{
    float4 vertex : POSITION;
    float2 uv : TEXCOORD0;
    float4 uv2 : TEXCOORD1;
    float4 uv3 : TEXCOORD2;
    half4 color : COLOR;
};

struct v2f
{
    float2 uv : TEXCOORD0;
    float4 vertex : SV_POSITION;
};

v2f vert (appdata v)
{
    v2f o;
    UNITY_INITIALIZE_OUTPUT(v2f, o);

    float4 wPos = float4(v.uv2.xyz, 1);
    float offsetZ = v.uv2.w;
    float offsetScale = v.uv3.y;

    float3 forward = normalize(_MainCamWPos - wPos.xyz);
    float3 up = _MainCamUp;
    float3 right = cross(forward, up);

    float2 bias = v.color.rg * 2 - 1;
    bias *= v.color.ba;
    wPos.xyz += right * bias.r * offsetScale + up * bias.g  * offsetScale + forward * offsetZ;
    // v.vertex.xyz = wPos; 注释掉这行

    o.vertex = mul(UNITY_MATRIX_VP, wPos);
    // o.vertex = mul(UNITY_MATRIX_VP, v.vertex); 注释掉这行
    o.uv = v.uv;

    return o;
}

上面的代码中没有使用到 v.vertex,因为顶点坐标是使用其它方式计算出来的,这就导致多个 billboard 无法被 Dynamic Batching,而当打开注释后,Dynamic Batching 就生效了。可能是引擎检测到顶点坐标没有使用,所以在 CPU 端就不触发 Dynamic Batching 了。