151 lines
5.1 KiB
Plaintext
151 lines
5.1 KiB
Plaintext
|
|
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
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
}
|