165 lines
4.2 KiB
Plaintext
165 lines
4.2 KiB
Plaintext
|
// 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
|
|||
|
}
|
|||
|
}
|
|||
|
}
|