miduo_client/Assets/ManagedResources/PublicArtRes/Shaders/MatCapAdd.shader

297 lines
7.4 KiB
Plaintext

// 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 vulkan
#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 vulkan
#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
}
}
}