返回

Unity Shader实现了动画效果:认识DisableBatching标记

闲谈

在Unity中,要想在着色器中实现顶点动画,必须使用DisableBatching标记。这是因为顶点动画需要改变顶点的位置,而批处理合并的顶点无法单独移动。这篇文章将解释为什么需要DisableBatching标记,以及如何正确使用它来实现顶点动画。

为什么需要DisableBatching标记?

Unity中的批处理(batching)是一种将具有相同材质、拓扑结构和变换的物体合并成一个渲染调用的优化技术。这种技术可以极大地提高渲染效率,但它并不适用于需要改变顶点位置的顶点动画。

这是因为在批处理过程中,Unity会将具有相同材质、拓扑结构和变换的物体合并成一个渲染调用。这意味着合并后的物体将共享同一个顶点缓冲区,而顶点动画需要改变顶点的位置,因此会导致整个批处理中的所有物体变形。

如何正确使用DisableBatching标记?

为了避免顶点动画变形,我们需要使用DisableBatching标记来阻止Unity将使用顶点动画的物体合并成批处理。这个标记可以添加到物体的材质中,也可以添加到场景中的渲染器组件上。

以下是在材质中添加DisableBatching标记的代码:

Shader "MyShader" {
    Properties {
        _Color ("Color", Color) = (1, 1, 1, 1)
    }
    SubShader {
        Tags { "DisableBatching" }
        LOD 100

        Pass {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            struct appdata {
                float4 vertex : POSITION;
                float4 color : COLOR;
            };

            struct v2f {
                float4 vertex : SV_POSITION;
                float4 color : COLOR;
            };

            v2f vert(appdata v) {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.color = v.color;
                return o;
            }

            fixed4 frag(v2f i) : SV_Target {
                return i.color;
            }
            ENDCG
        }
    }
}

以下是在场景中的渲染器组件上添加DisableBatching标记的代码:

public class MyScript : MonoBehaviour {
    void Start() {
        GetComponent<Renderer>().material.SetOverrideTag("DisableBatching", true);
    }
}

注意事项

需要注意的是,使用DisableBatching标记会降低渲染效率。因此,只应在需要顶点动画的物体上使用该标记。

此外,使用DisableBatching标记可能会导致物体无法被剔除。因此,在使用该标记时,应确保物体位于摄像机的视椎体内。

结论

DisableBatching标记是一种非常有用的工具,可以实现顶点动画。但使用该标记时,需要注意其对渲染效率和剔除的影响。