151 lines
5.1 KiB
Plaintext
Raw Normal View History

2025-09-08 17:37:12 +08:00
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
}
}
}