Files
zzwater/Assets/Test/Wind-Cloth(Vertex Weight).shader
2025-01-07 12:18:16 +08:00

137 lines
3.5 KiB
Plaintext

// Upgrade NOTE: commented out 'float4 unity_LightmapST', a built-in variable
// Upgrade NOTE: commented out 'sampler2D unity_Lightmap', a built-in variable
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// Upgrade NOTE: replaced tex2D unity_Lightmap with UNITY_SAMPLE_TEX2D
Shader "Wind/TreeLeaf-Cloth-CutOut(Vertex Weight)" {
Properties {
_MainTex ("Base (RGB) Gloss (A)", 2D) = "gray" {}
_Color ("Main Color", Color) = (1,1,1,1)
_Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
_Wind("Wind params",Vector) = (1,1,1,1)
_WindAmplitude("Wind Amplitude", float) = 0.5
_WindSpeed("Wind Speed",float) = 0.5
}
SubShader {
Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout" "LightMode"="ForwardBase"}
LOD 400
CGINCLUDE
#include "UnityCG.cginc"
#include "TerrainEngine.cginc"
sampler2D _MainTex;
float4 _MainTex_ST;
#ifndef LIGHTMAP_OFF
// float4 unity_LightmapST;
// sampler2D unity_Lightmap;
#endif
float _Cutoff = 0.5;
float4 _Color;
float _WindAmplitude;
float _WindSpeed;
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
float3 color : COLOR;
#ifndef LIGHTMAP_OFF
float2 lmap : TEXCOORD1;
#endif
};
inline float4 AnimateVertex2(float4 pos, float3 normal, float4 animParams,float4 wind,float2 time)
{
// animParams stored in color
// animParams.x = branch phase
// animParams.y = edge flutter factor
// animParams.z = primary factor
// animParams.w = secondary factor
float fDetailAmp = 0.1f;
float fBranchAmp = 0.3f;
// Phases (object, vertex, branch)
float fObjPhase = dot(unity_ObjectToWorld[3].xyz, 1);
float fBranchPhase = fObjPhase + animParams.x;
float fVtxPhase = dot(pos.xyz, animParams.y + fBranchPhase);
// x is used for edges; y is used for branches
float2 vWavesIn = time + float2(fVtxPhase, fBranchPhase );
// 1.975, 0.793, 0.375, 0.193 are good frequencies
float4 vWaves = (frac( vWavesIn.xxyy * float4(1.975, 0.793, 0.375, 0.193) ) * 2.0 - 1.0);
vWaves = SmoothTriangleWave( vWaves );
float2 vWavesSum = vWaves.xz + vWaves.yw;
// Edge (xz) and branch bending (y)
float3 bend = animParams.y * fDetailAmp * normal.xyz;
bend.y = animParams.w * fBranchAmp;
pos.xyz += ((vWavesSum.xyx * bend)*wind.w + (wind.xyz * vWavesSum.y * animParams.w)) * wind.w;
// Primary bending
// Displace position
pos.xyz += animParams.z * wind.xyz;
return pos;
}
v2f vert (appdata_full v)
{
v2f o;
float bendingFact = 1-v.color.b;
float4 wind;
wind.xyz = mul((float3x3)unity_WorldToObject,_Wind.xyz);
wind.w = _Wind.w * bendingFact;
float4 windParams = float4(0,_WindAmplitude,bendingFact.xx);
float windTime = _Time.y * float2(_WindSpeed,1);
float4 VertexInWndPos = AnimateVertex2(v.vertex,v.normal,windParams,wind,windTime);
o.pos = UnityObjectToClipPos(VertexInWndPos);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
#ifndef LIGHTMAP_OFF
o.lmap = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;
#endif
return o;
}
ENDCG
Pass {
CGPROGRAM
#pragma debug
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
fixed4 frag (v2f i) : COLOR
{
fixed4 c = tex2D (_MainTex, i.uv);
#ifndef LIGHTMAP_OFF
fixed3 lm = DecodeLightmap (UNITY_SAMPLE_TEX2D(unity_Lightmap, i.lmap));
c.rgb *= lm;
#endif
c *= _Color;
clip(c.a-_Cutoff);
return c;
}
ENDCG
}
}
}