297 lines
7.4 KiB
Plaintext
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
|
|
}
|
|
}
|
|
}
|
|
|