Tôi đã sử dụng một shader đỉnh ( dựa trên ví dụ này ) để làm động một lá cờ vẫy. Khi tôi có một lá cờ duy nhất trong cảnh của mình, nó hoạt động chính xác.
Khi tôi sao chép cờ, tất cả các bản sao sẽ bị biến dạng dữ dội sau khi tôi nhấn play.
Đây là mã shader tôi đang sử dụng:
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"
}
Làm cách nào tôi có thể thực hiện công việc này với nhiều cờ bằng cùng một vật liệu?
Tôi có nên sử dụng một ví dụ vật liệu mới cho từng đối tượng như thế này không? Nó không có vẻ tối ưu:
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