Ich habe einen Vertex-Shader ( basierend auf diesem Beispiel ) verwendet, um ein wehendes Flag zu animieren. Wenn ich eine einzelne Flagge in meiner Szene habe, funktioniert sie korrekt.
Wenn ich die Flagge dupliziere, werden alle Kopien nach dem Drücken von "Play" stark verzerrt.
Hier ist der Shader-Code, den ich verwende:
Shader "Custom/Flag" {
Properties {
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Speed ("Speed", Range(0, 5.0)) = 1
_Frequency ("Frequency", Range(0, 1.3)) = 1
_Amplitude ("Amplitude", Range(0, 5.0)) = 1
}
SubShader {
Tags { "RenderType"="Opaque" }
Cull off
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
float4 _MainTex_ST;
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
float _Speed;
float _Frequency;
float _Amplitude;
v2f vert(appdata_base v)
{
v2f o;
v.vertex.y += cos((v.vertex.x + _Time.y * _Speed) * _Frequency) * _Amplitude * (v.vertex.x - 5);
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag(v2f i) : SV_Target
{
return tex2D(_MainTex, i.uv);
}
ENDCG
}
}
FallBack "Diffuse"
}
Wie kann ich dafür sorgen, dass mehrere Flags mit demselben Material verwendet werden?
Sollte ich für jedes Objekt wie dieses eine neue Materialinstanz verwenden? Es scheint nicht optimal:
material = new Material (Shader); // Create new material
material.SetFloat ("_Speed", _Speed);
material.SetFloat ("_Frequency", _Frequency);
material.SetFloat ("_Amplitude", _Amplitude);
material.SetTexture ("_MainTex", _MainTex);
flagObj.GetComponent<MeshRenderer>().sharedMaterial = material; // Set values