Files
Main/Assets/GameAssets/RawResources/vfx/fxresources/cartoon.shader
2025-01-25 04:38:09 +08:00

165 lines
4.2 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Tut/Shader/Toon/toon" {
Properties {
//_Color("Main Color",2d)="white" {}//物体的颜色
_Color("Main Color",color)=(1,1,1,1)//物体的颜色
_Outline("Thick of Outline",range(0,0.1))=0.02//挤出描边的粗细
_Factor("Factor",range(0,1))=0.5//挤出多远
_ToonEffect("Toon Effect",range(0,1))=0.5//卡通化程度(二次元与三次元的交界线)
_Steps("Steps of toon",range(0,9))=3//色阶层数
//_diff("diff",2d)="white"{}
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader {
pass{//处理光照前的pass渲染
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{//平行光的的pass渲染
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);//切换到世界坐标
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));//求出正常的漫反射颜色
diff=(diff+1)/2;//做亮化处理
diff=smoothstep(0,1,diff);//使颜色平滑的在[0,1]范围之内
float toon=floor(diff*_Steps)/_Steps;//把颜色做离散化处理把diffuse颜色限制在_Steps种_Steps阶颜色简化颜色这样的处理使色阶间能平滑的显示
diff=lerp(diff,toon,_ToonEffect);//根据外部我们可控的卡通化程度值_ToonEffect调节卡通与现实的比重
float4 col = tex2D(_MainTex, i.texcoord);
c=_Color*_LightColor0*(diff)*col;//把最终颜色混合
return c;
}
ENDCG
}//
pass{//附加点光源的pass渲染
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);//求出距离光源的距离
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);//根据距光源的距离求出衰减
float toon=floor(diff*atten*_Steps)/_Steps;
diff=lerp(diff,toon,_ToonEffect);
half3 h = normalize (lightDir + viewDir);//求出半角向量
float nh = max (0, dot (N, h));
float spec = pow (nh, 32.0);//求出高光强度
float toonSpec=floor(spec*atten*2)/ 2;//把高光也离散化
spec=lerp(spec,toonSpec,_ToonEffect);//调节卡通与现实高光的比重
c=_Color*_LightColor0*(diff+spec);//求出最终颜色
return c;
}
ENDCG
}
}
}