Shader "Unlit/MaoFaF" { Properties { _MainTex("MainTex",2D)="white"{}//毛皮颜色 _Noise ("Noise", 2D) = "white" {}//毛发形状贴图 _Noise2 ("Noise", 2D) = "white" {}//毛发形状扰动贴图 _Mask("Mask",2D)="white"{} _Color("Color",color)=(1,1,1,1)//毛发的染色 _LayerOffset("LayerOffset",float)=0.1//当前层的偏移量 _FurLength("FurLength",float)=1//总体毛发长度 //_ShadowStrength("FurShadow",Range(0,1))=0.5//从根部到顶部阴影颜色过渡曲线 _ShadowColor("ShadowColor",color)=(1,1,1,1)//由根部到顶部阴影的颜色 _R("R",Range(0,1))=0.5 //_LengthMut("LengthMut",Range(0,5))=1 //[Enum(Off,0,On,1)]_ZWriteMode("ZWrite Mode", Int) = 1 //_FurOffset("FurOffset",vector)=(0,1,0,0)//毛发偏移方向 } SubShader { Tags { "RenderType" = "Transparent" "IgnoreProjector" = "True" "Queue" = "Transparent" } //LOD 100 Pass { Blend SrcAlpha OneMinusSrcAlpha Cull Front ZWrite off //[_ZWriteMode] HLSLPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile _ LIGHTMAP_ON #pragma multi_compile _ _MAIN_LIGHT_SHADOWS //接受主光源阴影 #pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE //投射主光源的阴影 #pragma multi_compile _ _SHADOWS_SOFT //软阴影 #pragma multi_compile _ _ADDITIONAL_LIGHTS //附加光源 #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" struct appdata { float4 vertex : POSITION; float3 normal:NORMAL; float4 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; float3 wpos:TEXCOORD1; float3 wnormal:TEXCOORD2; }; TEXTURE2D( _MainTex); SAMPLER(sampler_MainTex); TEXTURE2D( _Mask);SAMPLER(sampler_Mask); TEXTURE2D(_Noise);SAMPLER(sampler_Noise); TEXTURE2D(_Noise2);SAMPLER(sampler_Noise2); float4 _Color; float4 _Noise_ST; float _LayerOffset; //float3 _FurOffset; float _FurLength; float3 _ShadowColor; float _ShadowStrength; float _R; float _LengthMut; float rand(float3 seed, float Min, float Max) { float f = sin(dot(seed, float3(127.1, 337.1, 256.2))); f = -1 + 2 * frac(f * 43785.5453123); return lerp(Min, Max, f); } float RandomRange_float(float2 Seed, float Min, float Max) { float randomno = frac(sin(dot(Seed, float2(12.9898, 78.233)))*43758.5453); return lerp(Min, Max, randomno); } float Remap(float x,float inMin,float inMax,float toMin ,float toMax) { return (x-inMin)/(inMax-inMin)*(toMax-toMin)+toMin; } v2f vert (appdata v) { v2f o; v.vertex.xyz=v.vertex.xyz+v.normal.xyz*(_LayerOffset*0.8)*_FurLength*_LengthMut; //v.vertex.xyz+=mul(unity_WorldToObject,_FurOffset);//不需要位移 o.vertex = TransformObjectToHClip(v.vertex); o.wpos=mul(UNITY_MATRIX_M,v.vertex); o.uv = v.uv; o.wnormal=(mul(v.normal,(float3x3)unity_WorldToObject)); return o; } // [earlydepthstencil] float4 frag (v2f i) : SV_Target { float3 albedo = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex,i.uv.xy).rgb ; float3 color = albedo*0.8;//diffuse +specular+rim+ambient ; //从底部到顶部阴影过渡 //color =lerp(_ShadowColor,color,saturate(pow( _LayerOffset,1)+0.5)); float mask = SAMPLE_TEXTURE2D(_Mask, sampler_Mask,i.uv).r; mask=Remap(mask,0,1,0.5,1); //修改毛发的密度与重复度 float3 noise2 = SAMPLE_TEXTURE2D(_Noise2, sampler_Noise2,i.uv*10+i.uv*(1-mask)*5); float3 noise = SAMPLE_TEXTURE2D(_Noise,sampler_Noise, i.uv*30+noise2*30+i.uv*(1-mask)*50); noise=lerp(noise2,noise,0.6); float alpha = (saturate(noise*2) - (_LayerOffset )-(1-mask)); return float4((color)*1,saturate(alpha*1)); } ENDHLSL } } }