Files
Main/Assets/GameAssets/RawResources/vfx/fxresources/cartoon.shader

165 lines
4.2 KiB
Plaintext
Raw Normal View History

2025-01-25 04:38:09 +08:00
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Tut/Shader/Toon/toon" {
Properties {
//_Color("Main Color",2d)="white" {}//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
_Color("Main Color",color)=(1,1,1,1)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
_Outline("Thick of Outline",range(0,0.1))=0.02//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵĴ<DFB5>ϸ
_Factor("Factor",range(0,1))=0.5//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ
_ToonEffect("Toon Effect",range(0,1))=0.5//<2F><>ͨ<EFBFBD><CDA8><EFBFBD>̶ȣ<CCB6><C8A3><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD>ߣ<EFBFBD>
_Steps("Steps of toon",range(0,9))=3//ɫ<>ײ<EFBFBD><D7B2><EFBFBD>
//_diff("diff",2d)="white"{}
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader {
pass{//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>pass<73><73>Ⱦ
Tags{"LightMode"="Always"}
Cull Front
ZWrite On
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float _Outline;
float _Factor;
struct v2f {
float4 pos:SV_POSITION;
//sampler2D _Color;
//float4 _Color_ST;
//float4 vertex : POSITION;
//float3 normal : NORMAL;
//float4 texcoord : TEXTOORD0;
};
v2f vert (appdata_full v) {
v2f o;
//o.texcoord = TRANSFORM_TEX(v.texcoord, _color);
float3 dir=normalize(v.vertex.xyz);
float3 dir2=v.normal;
float D=dot(dir,dir2);
dir=dir*sign(D);
dir=dir*_Factor+dir2*(1-_Factor);
v.vertex.xyz+=dir*_Outline;
o.pos=UnityObjectToClipPos(v.vertex);
return o;
}
float4 frag(v2f i):COLOR
{
float4 c=0;
return c;
}
ENDCG
}//end of pass
pass{//ƽ<>й<EFBFBD><D0B9>ĵ<EFBFBD>pass<73><73>Ⱦ
Tags{"LightMode"="ForwardBase"}
Cull Back
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float4 _LightColor0;
float4 _Color;
float _Steps;
float _ToonEffect;
sampler2D _MainTex;
//sampler2D _Color;
//float4 _Color_ST;
struct v2f {
float4 pos:SV_POSITION;
float3 lightDir:TEXCOORD0;
float3 viewDir:TEXCOORD1;
float3 normal:TEXCOORD2;
float2 texcoord:TEXCOORD3;
};
v2f vert (appdata_full v) {
v2f o;
o.pos=UnityObjectToClipPos(v.vertex);//<2F>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
o.normal=v.normal;
o.lightDir=ObjSpaceLightDir(v.vertex);
o.viewDir=ObjSpaceViewDir(v.vertex);
o.texcoord = v.texcoord;
return o;
}
float4 frag(v2f i):COLOR
{
float4 c=1;
float3 N=normalize(i.normal);
float3 viewDir=normalize(i.viewDir);
float3 lightDir=normalize(i.lightDir);
float diff=max(0,dot(N,i.lightDir));//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
diff=(diff+1)/2;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
diff=smoothstep(0,1,diff);//ʹ<><CAB9>ɫƽ<C9AB><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[0,1]<5D><>Χ֮<CEA7><D6AE>
float toon=floor(diff*_Steps)/_Steps;//<2F><><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>ɢ<EFBFBD><C9A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>diffuse<73><65>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_Steps<70>֣<EFBFBD>_Steps<70><73><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>ʹɫ<CAB9>׼<EFBFBD><D7BC><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
diff=lerp(diff,toon,_ToonEffect);//<2F><><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD>ǿɿصĿ<D8B5>ͨ<EFBFBD><CDA8><EFBFBD>̶<EFBFBD>ֵ_ToonEffect<63><74><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>ʵ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD>
float4 col = tex2D(_MainTex, i.texcoord);
c=_Color*_LightColor0*(diff)*col;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
return c;
}
ENDCG
}//
pass{//<2F><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD>Դ<EFBFBD><D4B4>pass<73><73>Ⱦ
Tags{"LightMode"="ForwardAdd"}
Blend One One
Cull Back
ZWrite Off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float4 _LightColor0;
float4 _Color;
float _Steps;
float _ToonEffect;
struct v2f {
float4 pos:SV_POSITION;
float3 lightDir:TEXCOORD0;
float3 viewDir:TEXCOORD1;
float3 normal:TEXCOORD2;
};
v2f vert (appdata_full v) {
v2f o;
//o.texcoord = TRANSFORM_TEX(v.texcoord, _color);
o.pos=UnityObjectToClipPos(v.vertex);
o.normal=v.normal;
o.viewDir=ObjSpaceViewDir(v.vertex);
o.lightDir=_WorldSpaceLightPos0-v.vertex;
return o;
}
float4 frag(v2f i):COLOR
{
float4 c=1;
//float4 _diff_var = tex2D(_diff,TRANSFORM_TEX(i.uv0, diff));
float3 N=normalize(i.normal);
float3 viewDir=normalize(i.viewDir);
float dist=length(i.lightDir);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
float3 lightDir=normalize(i.lightDir);
float diff=max(0,dot(N,i.lightDir));
diff=(diff+1)/2;
diff=smoothstep(0,1,diff);
float atten=1/(dist);//<2F><><EFBFBD>ݾ<EFBFBD><DDBE><EFBFBD>Դ<EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˥<EFBFBD><CBA5>
float toon=floor(diff*atten*_Steps)/_Steps;
diff=lerp(diff,toon,_ToonEffect);
half3 h = normalize (lightDir + viewDir);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float nh = max (0, dot (N, h));
float spec = pow (nh, 32.0);//<2F><><EFBFBD><EFBFBD><EFBFBD>߹<EFBFBD>ǿ<EFBFBD><C7BF>
float toonSpec=floor(spec*atten*2)/ 2;//<2F>Ѹ߹<D1B8>Ҳ<EFBFBD><D2B2>ɢ<EFBFBD><C9A2>
spec=lerp(spec,toonSpec,_ToonEffect);//<2F><><EFBFBD>ڿ<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>ʵ<EFBFBD>߹<EFBFBD><DFB9>ı<EFBFBD><C4B1><EFBFBD>
c=_Color*_LightColor0*(diff+spec);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
return c;
}
ENDCG
}
}
}