// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' // Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject' // MatCap Shader, (c) 2015 Jean Moreno Shader "ysj/MatCapAdd" { Properties { _Color("Color", Color) = (1,1,1,1) _MainTex ("Base (RGB)", 2D) = "white" {} _MatCap ("MatCap (RGB)", 2D) = "white" {} _power ("power", Range(0, 5)) = 0.6 [MaterialToggle] _switch ("switch", Float ) = 0 _Reverse("_Reverse",Float) = 1 _LightDir("LightDir", Vector) = (0.2,-0.6, -0.8, 0.0) _ShadowColor("ShadowColor", Color) = (0.0, 0.0, 0.0, 0.5) _LightPos("LightPos", Vector) = (0.7, -0.5, 24.2, 0.0) _ShadowFalloff("ShadowFalloff",Float) = 0.3 _disolvetex ("disolve tex", 2D) = "white" {} _edgecolor ("edge color", Color) = (1,0.8068966,0,1) _strength ("strength", Range(0, 1)) = 0.13599 } Subshader { Tags { "RenderType"="Opaque" "CutBackground" = "Back" } LOD 500 Pass { Tags { "LightMode" = "Always" } CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma only_renderers d3d9 d3d11 glcore gles gles3 metal #pragma fragmentoption ARB_precision_hint_fastest #pragma multi_compile_fog #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; float2 cap : TEXCOORD1; float4 posWorld : TEXCOORD2; float3 normalDir : TEXCOORD3; UNITY_FOG_COORDS(4) }; uniform sampler2D _MainTex; uniform float4 _MainTex_ST; uniform sampler2D _MatCap; uniform fixed _power; uniform fixed _switch; uniform fixed4 _Color; uniform fixed _Reverse; uniform sampler2D _disolvetex; uniform float _strength; uniform float4 _edgecolor; v2f vert (appdata_base v) { v2f o; o.pos = UnityObjectToClipPos (v.vertex); UNITY_TRANSFER_FOG(o,o.pos); o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); float3 vN = v.normal*_Reverse; o.normalDir = UnityObjectToWorldNormal(vN) ; o.posWorld = mul(unity_ObjectToWorld, v.vertex); float3 worldNorm = normalize(unity_WorldToObject[0].xyz * vN.x + unity_WorldToObject[1].xyz * vN.y + unity_WorldToObject[2].xyz * vN.z); worldNorm = mul((float3x3)UNITY_MATRIX_V, worldNorm); o.cap.xy = worldNorm.xy * 0.5 + 0.5; return o; } fixed4 frag (v2f i, float facing : VFACE) : COLOR { float4 _disolvetex_var = tex2D(_disolvetex,i.uv); float node_6778 = (((1.0 - _strength)*1.0+-0.5)+_disolvetex_var.r); clip(node_6778 - 0.5); i.normalDir = normalize(i.normalDir); float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz); fixed4 tex = tex2D(_MainTex, i.uv); fixed4 mc = tex2D(_MatCap, i.cap); fixed4 capTex = tex + (mc*2.0)-1.0; fixed3 v1 = max(0, dot(i.normalDir , viewDirection)); fixed3 p1 = pow(1.0 - v1, _power); fixed3 f1 = fixed3(0.463, 0.067, 0.078)*p1*1.5*_switch; float3 mainTexFre = (capTex.rgb+f1)*_Color.rgb; float3 emissive = lerp(_edgecolor.rgb,mainTexFre,step(0.53*step(0.01,_strength),node_6778)); UNITY_APPLY_FOG(i.fogCoord, emissive); return fixed4(emissive,1); } ENDCG } //阴影pass Pass { Name "Shadow" //用使用模板测试以保证alpha显示正确 Stencil { Ref 0 Comp equal Pass incrWrap Fail keep ZFail keep } //透明混合模式 Blend SrcAlpha OneMinusSrcAlpha //关闭深度写入 ZWrite off //深度稍微偏移防止阴影与地面穿插 Offset -1 , 0 CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; }; struct v2f { float4 vertex : SV_POSITION; float4 color : COLOR; }; float4 _LightDir; float4 _ShadowColor; float _ShadowFalloff; float4 _LightPos; float3 ShadowProjectPos(float4 vertPos) { float3 shadowPos; //得到顶点的世界空间坐标 float3 worldPos = mul(unity_ObjectToWorld , vertPos).xyz; //灯光方向 float3 lightDir = normalize(_LightDir.xyz); //阴影的世界空间坐标(低于地面的部分不做改变) shadowPos.y = min(worldPos.y , _LightDir.w); shadowPos.xz = worldPos.xz - lightDir.xz * max(0 , worldPos.y - _LightPos.w) / lightDir.y; return shadowPos; } v2f vert(appdata v) { v2f o; //得到阴影的世界空间坐标 float3 shadowPos = ShadowProjectPos(v.vertex); //转换到裁切空间 o.vertex = UnityWorldToClipPos(shadowPos); //得到中心点世界坐标 float3 center = float3(unity_ObjectToWorld[0].w , _LightPos.w , unity_ObjectToWorld[2].w); //计算阴影衰减 float falloff = 1 - saturate(distance(shadowPos , center) * _ShadowFalloff); //阴影颜色 o.color = _ShadowColor; o.color.a *= falloff; return o; } fixed4 frag(v2f i) : SV_Target { return i.color; } ENDCG } } Subshader { Tags{ "RenderType" = "Opaque" "CutBackground" = "Back" } LOD 100 Pass { Tags{ "LightMode" = "Always" } CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma only_renderers d3d9 d3d11 glcore gles gles3 metal #pragma fragmentoption ARB_precision_hint_fastest #pragma multi_compile_fog #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; float2 cap : TEXCOORD1; float4 posWorld : TEXCOORD2; float3 normalDir : TEXCOORD3; UNITY_FOG_COORDS(4) }; uniform float4 _MainTex_ST; uniform fixed _Reverse; uniform sampler2D _disolvetex; uniform float _strength; uniform float4 _edgecolor; v2f vert(appdata_base v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); UNITY_TRANSFER_FOG(o,o.pos); o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); float3 vN = v.normal*_Reverse; o.normalDir = UnityObjectToWorldNormal(vN); o.posWorld = mul(unity_ObjectToWorld, v.vertex); float3 worldNorm = normalize(unity_WorldToObject[0].xyz * vN.x + unity_WorldToObject[1].xyz * vN.y + unity_WorldToObject[2].xyz * vN.z); worldNorm = mul((float3x3)UNITY_MATRIX_V, worldNorm); o.cap.xy = worldNorm.xy * 0.5 + 0.5; return o; } uniform sampler2D _MainTex; uniform sampler2D _MatCap; uniform fixed _power; uniform fixed _switch; uniform fixed4 _Color; fixed4 frag(v2f i, float facing : VFACE) : COLOR { float4 _disolvetex_var = tex2D(_disolvetex,i.uv); float node_6778 = (((1.0 - _strength)*1.0+-0.5)+_disolvetex_var.r); clip(node_6778 - 0.5); i.normalDir = normalize(i.normalDir); float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz); fixed4 tex = tex2D(_MainTex, i.uv); fixed4 mc = tex2D(_MatCap, i.cap); fixed4 capTex = tex + (mc*2.0) - 1.0; fixed3 v1 = max(0, dot(i.normalDir , viewDirection)); fixed3 p1 = pow(1.0 - v1, _power); fixed3 f1 = fixed3(0.463, 0.067, 0.078)*p1*1.5*_switch; float3 mainTexFre = (capTex.rgb + f1)*_Color.rgb; float3 emissive = lerp(_edgecolor.rgb,mainTexFre,step(0.53,node_6778)); UNITY_APPLY_FOG(i.fogCoord, emissive); return fixed4(emissive,1); } ENDCG } } }