// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' Shader "SuYou/MainRole" { Properties { _MainTex("Base 2D", 2D) = "white"{} _Mask("Mask Texture", 2D) = "white" {} _MatcapTex("Matcap Texture", 2D) = "white" {} _AmbientColor("AmbientColor", Color) = (0.69, 0.69,0.69,1) _SunColor("SunColor", Color) = (1, 1, 1,1) _DarkShadow("DarkShadow", Color) = (0.745, 0.619, 0.905,1) _BrightShadow("BrightShadow", Color) = (0.843, 0.843, 0.843,1) _RimColor("RimColor", Color) = (0.278, 0.443, 0.831, 1) _Shadownol1("Shadownol1", Range(0, 1)) = 1 _Shadownol2("Shadownol2", Range(0, 1)) = 0.5 _ShadowDir("ShadowDir", vector) = (0.5, 0, 0, 1) _RimDir("RimDir", vector) = (-0.977, -0.23, 0.212, 1) _MatcapScale1("MatcapScale1", float) = 1 _MatcapScale2("MatcapScale2", float) = 1 _Color("Color", Color) = (0.5,0.5,0.5,1) } SubShader { Tags{"RenderType" = "Opaque" } Cull Off Pass { Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma vertex vert #pragma fragment frag // #pragma multi_compile __ _GAME_ON #include "UnityCG.cginc" uniform fixed4 _Color; struct appdataInput { float4 vertex : POSITION; float2 uv : TEXCOORD0; float3 normal:NORMAL; float4 tangent : TANGENT; }; struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; float4 posWorld : TEXCOORD1; float3 normalDir : TEXCOORD2; float3 dir_rimlight : TEXCOORD3; float3 dir_shadow : TEXCOORD4; }; float4 _ShadowDir, _RimDir; v2f vert(appdataInput v) { v2f o; o.posWorld = mul(unity_ObjectToWorld, v.vertex); o.pos = mul(UNITY_MATRIX_VP, o.posWorld); o.uv = v.uv; o.normalDir = mul((float3x3)unity_ObjectToWorld, v.normal); o.dir_rimlight = normalize(_RimDir.xyz); o.dir_shadow = normalize(_ShadowDir.xyz); return o; } sampler2D _MainTex, _Mask, _MatcapTex; float4 _AmbientColor, _SunColor, _BrightShadow, _DarkShadow, _RimColor; float _Shadownol1, _Shadownol2, _MatcapScale1, _MatcapScale2; float4 frag(v2f i) : SV_Target { float3 mainColor = tex2D(_MainTex, i.uv).rgb; float3 diffuse_fac = _SunColor + _AmbientColor.xyz; float3 diffuse = mainColor * 0.5 * 1.2784 * diffuse_fac; float3 N = normalize(i.normalDir); float3 L = i.dir_shadow.xyz; float4 resultColor; // #ifdef _GAME_ON // float3 baseColor = diffuse.rgb; // resultColor.rgb = baseColor; // #else float3 V = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz); float NdotView = clamp(dot(N, V), 0, 1); float NdotshadowFactor = clamp(dot(L, N), 0, 1); float RimlightDotValue = clamp(dot(i.dir_rimlight, N), 0.0, 1.0); float Ndotshadow = smoothstep(_Shadownol1, _Shadownol2, NdotshadowFactor); float dif_illum = dot(diffuse, float3(0.299, 0.587, 0.114)); float shadowshift = smoothstep(0.25, 0.74, dif_illum); float3 shadowColor = lerp(_DarkShadow.rgb, _BrightShadow.rgb, shadowshift); float3 baseColor = lerp(shadowColor * diffuse.rgb, diffuse.rgb, Ndotshadow); float rimdot = clamp(RimlightDotValue * (1.0 - NdotView), 0.0, 1.0); float rimffcal = smoothstep(0.35, 0.58, rimdot); float3 rim = rimffcal * diffuse * _RimColor.rgb; resultColor.rgb = baseColor + rim; // #endif float3 maskTemp = tex2D(_Mask, i.uv).rgb; float2 matcapuv = mul((float3x3)UNITY_MATRIX_V, N).xy; matcapuv.y = -matcapuv.y; matcapuv = matcapuv * 0.5 + 0.5; float3 matColor1 = tex2D(_MatcapTex, float2(matcapuv.x * 0.5, matcapuv.y)).rgb; float3 matColor2 = tex2D(_MatcapTex, float2(matcapuv.x * 0.5 + 0.5, matcapuv.y)).rgb; float matColor = (matColor1 * maskTemp.x * _MatcapScale1 + matColor2 * maskTemp.y * _MatcapScale2); resultColor.rgb += (matColor * diffuse + maskTemp.z * diffuse); resultColor.a = 1; return resultColor * _Color; } ENDCG } } }