1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
|
#ifndef MFX_INCLUDED
#define MFX_INCLUDED
//EMISSION 2
uniform float3 _EmissionColor2;
uniform float _EmissionSize2;
sampler2D _EmissionMap2;
uniform float4 _EmissionMap2_ST;
uniform float2 _EmissionMap2_Scroll;
//ALBEDO 2
uniform float4 _Color2;
sampler2D _MainTex2;
uniform float4 _MainTex2_ST;
//NORMAL
sampler2D _BumpMap2;
uniform float4 _BumpMap2_ST;
//MASK
uniform float _MaskType;
uniform float _CutoffAxis;
uniform float _MaskOffset;
uniform float4 _MaskWorldPosition;
//EDGE
uniform float3 _EdgeColor;
uniform sampler2D _EdgeRampMap1;
uniform float4 _EdgeRampMap1_ST;
uniform float2 _EdgeRampMap1_Scroll;
uniform float _EdgeSize;
uniform float _EdgeStrength;
//DISSOLVE
uniform float3 _DissolveEdgeColor;
uniform float _DissolveEdgeSize;
uniform float _DissolveSize;
sampler2D _DissolveMap1;
uniform float4 _DissolveMap1_ST;
uniform float2 _DissolveMap1_Scroll;
#define MFX_TRANSFORM_TEX(texUV,texName) (texUV.xy * texName##_ST.xy + texName##_ST.zw + texName##_Scroll * _Time.y)
inline float Remap(float s, float a1, float a2, float b1, float b2)
{
return b1 + (s - a1) * (b2 - b1) / (a2 - a1);
}
inline void MfxClip(float alpha)
{
clip(alpha - _Cutoff);
}
inline void PassMfxVertex2Fragment(float2 mainUv, inout float4 mfxUv) //xy - edge, zw - dissolve
{
mfxUv.xy = MFX_TRANSFORM_TEX(mainUv, _EdgeRampMap1);
mfxUv.zw = MFX_TRANSFORM_TEX(mainUv, _DissolveMap1);
}
//--------------
// POSITION
inline float GetMfxLocalPosition(float3 vertexPos)
{
float pos = mul(unity_WorldToObject, float4(vertexPos, 1))[(int)_CutoffAxis];
return pos;
}
inline float GetMfxGlobalPosition(float3 vertexPos)
{
float pos = (vertexPos)[(int)_CutoffAxis];
return pos;
}
inline float GetMfxLengthGlobalPosition(float3 vertexPos)
{
return length(_MaskWorldPosition - vertexPos);
}
inline float GetMfxSinglePosition(float3 vertexPos)
{
#if defined(_MASKTYPE_AXIS_LOCAL)
return GetMfxLocalPosition(vertexPos);
#elif defined (_MASKTYPE_AXIS_GLOBAL)
return GetMfxGlobalPosition(vertexPos);
#elif defined (_MASKTYPE_GLOBAL)
return GetMfxLengthGlobalPosition(vertexPos);
#endif
return 1;
}
inline float GetAlpha(float2 mfxDissolveUv, float3 vertexPos)
{
float pos = GetMfxSinglePosition(vertexPos);
float mask_pos = (pos - _MaskOffset);
float alpha = (_DissolveSize + (mask_pos - (_MaskOffset - tex2D(_DissolveMap1, mfxDissolveUv).r)));
return alpha;
}
//--------------
// DISSOLVE
inline float GetMfxDissolve(float4 mfxUv, float3 vertexPos)
{
#if defined(_MASKTYPE_AXIS_LOCAL) || defined(_MASKTYPE_AXIS_GLOBAL) || defined(_MASKTYPE_GLOBAL)
float alpha = GetAlpha(mfxUv.zw, vertexPos);
return alpha;
#elif defined(_MASKTYPE_NONE)
float alpha = tex2D(_DissolveMap1, mfxUv.zw).r;
return alpha;
#endif
return 1;
}
//TODO move into func
//DIFFUSE
half3 GetMfxAlbedo(float2 mainUv, float4 mfxUv, float3 vertexPos, half3 baseAlbedo)
{
float pos = GetMfxSinglePosition(vertexPos);
float mask_pos = pos - _MaskOffset;
float edge_pos = ( mask_pos - ( _MaskOffset - tex2D( _EdgeRampMap1, mfxUv.xy ).r ) );
float scaled_edge = ( (50.0 + (_EdgeSize - 0.0) * (0.0 - 50.0) / (1.0 - 0.0)) * edge_pos );
float clamp_scaled_edge = clamp( scaled_edge , 0.0 , 1.0 );
float edge = clamp( ( 1.0 - abs( scaled_edge ) ) , 0.0 , 1.0 );
float edge_threshold = ( ( 1.0 - clamp_scaled_edge ) - edge );
half3 final_albedo = lerp(baseAlbedo , ( _Color2 * tex2D( _MainTex2, mainUv ) ) , edge_threshold);
return final_albedo;
}
//NORMAL
half3 GetMfxNormal(float2 mainUv, float4 mfxUv, float3 vertexPos, half3 baseNormal)
{
float pos = GetMfxSinglePosition(vertexPos);
float mask_pos = pos - _MaskOffset;
float edge_pos = ( mask_pos - ( _MaskOffset - tex2D( _EdgeRampMap1, mfxUv.xy ).r ) );
float scaled_edge = ( (50.0 + (_EdgeSize - 0.0) * (0.0 - 50.0) / (1.0 - 0.0)) * edge_pos );
float clamp_scaled_edge = clamp( scaled_edge , 0.0 , 1.0 );
float edge = clamp( ( 1.0 - abs( scaled_edge ) ) , 0.0 , 1.0 );
float edge_threshold = ( ( 1.0 - clamp_scaled_edge ) - edge );
half3 final_normal = lerp(baseNormal , UnpackNormal( tex2D( _BumpMap2, mainUv ) ) , edge_threshold);
return final_normal;
}
//EMISSION
half3 GetMfxEmission(float2 mainUv, float4 mfxUv, float3 vertexPos, half3 baseEmission, float alpha)
{
float pos = GetMfxSinglePosition(vertexPos);
float mask_pos = pos - _MaskOffset;
float edge_pos = ( mask_pos - ( _MaskOffset - tex2D( _EdgeRampMap1, mfxUv.xy ).r ) );
float scaled_edge = ( (50.0 + (_EdgeSize - 0.0) * (0.0 - 50.0) / (1.0 - 0.0)) * edge_pos );
float clamp_scaled_edge = clamp( scaled_edge , 0.0 , 1.0 );
float edge = clamp( ( 1.0 - abs( scaled_edge ) ) , 0.0 , 1.0 );
float edge_threshold = ( ( 1.0 - clamp_scaled_edge ) - edge );
float emissionMap = clamp((((1.0 - tex2D(_EmissionMap2, mfxUv.xy).r) - 0.5) * 3.0), 0.0, 1.0);
float3 emission2 = (_EmissionColor2 * (pow(emissionMap, 3.0) * saturate(((mask_pos - _MaskOffset) + (0.0 + (_EmissionSize2 - 0.0) * (3.0 - 0.0) / (1.0 - 0.0))))));
float3 emission2_base = lerp(baseEmission, emission2, edge_threshold);
float alpha_original = alpha + _Cutoff;
float edge_emission = smoothstep((1.0 - _EdgeSize), 1.0, edge);
float3 final_emission = ((alpha <= _DissolveEdgeSize) ? _DissolveEdgeColor : (emission2_base + (((1.0 + (_EdgeStrength - 0.0) * (0.1 - 1.0) / (1.0 - 0.0)) <= edge_emission) ? _EdgeColor : (_EdgeColor * edge_emission))));
return final_emission;
}
//--------------
#endif // MFX_INCLUDED
|