返回
Unity Shader实现了动画效果:认识DisableBatching标记
闲谈
2023-10-16 04:48:06
在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标记是一种非常有用的工具,可以实现顶点动画。但使用该标记时,需要注意其对渲染效率和剔除的影响。