You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
251 lines
6.8 KiB
251 lines
6.8 KiB
|
|
sampler2D _GrabTexture; |
|
sampler2D _MainTex; |
|
sampler2D _NormalTex; |
|
float4 _NormalTex_ST; |
|
float4 _MainTex_ST; |
|
half4 _TintColor; |
|
half4 _MainColor; |
|
half _Distortion; |
|
half _RefractiveStrength; |
|
half _InvFade; |
|
|
|
sampler2D _HeightTex; |
|
float4 _HeightTex_ST; |
|
half4 _HeightUVScrollDistort; |
|
half _Height; |
|
|
|
half4 _FresnelColor; |
|
half _FresnelPow; |
|
half _FresnelR0; |
|
half _FresnelDistort; |
|
|
|
sampler2D _CutoutTex; |
|
float4 _CutoutTex_ST; |
|
half _Cutout; |
|
half4 _CutoutColor; |
|
half _CutoutThreshold; |
|
half _AlphaClip; |
|
|
|
sampler2D _CameraDepthTexture; |
|
float4x4 _InverseTransformMatrix; |
|
|
|
struct appdata |
|
{ |
|
float4 vertex : POSITION; |
|
#if defined (USE_HEIGHT) || defined (USE_REFRACTIVE) || defined (USE_FRESNEL) |
|
half3 normal : NORMAL; |
|
#endif |
|
#ifdef USE_REFRACTIVE |
|
half4 tangent : TANGENT; |
|
#endif |
|
half4 color : COLOR; |
|
#ifdef USE_BLENDING |
|
#if UNITY_VERSION == 600 |
|
float4 uv : TEXCOORD0; |
|
float texcoordBlend : TEXCOORD1; |
|
#else |
|
float2 uv : TEXCOORD0; |
|
float4 texcoordBlendFrame : TEXCOORD1; |
|
#endif |
|
#else |
|
float2 uv : TEXCOORD0; |
|
#endif |
|
}; |
|
|
|
struct v2f |
|
{ |
|
float4 vertex : SV_POSITION; |
|
half4 color : COLOR; |
|
#ifdef USE_BLENDING |
|
float4 uv : TEXCOORD0; |
|
fixed blend : TEXCOORD1; |
|
#else |
|
float2 uv : TEXCOORD0; |
|
#endif |
|
half4 uvgrab : TEXCOORD2; |
|
UNITY_FOG_COORDS(3) |
|
#ifdef USE_CUTOUT |
|
float2 uvCutout : TEXCOORD4; |
|
#endif |
|
#if defined (USE_SOFT_PARTICLES) && defined (SOFTPARTICLES_ON) |
|
float4 projPos : TEXCOORD5; |
|
#endif |
|
#ifdef USE_MAINTEX |
|
float2 mainUV : TEXCOORD6; |
|
#endif |
|
#ifdef USE_FRESNEL |
|
#if defined (USE_HEIGHT) |
|
half4 localPos : TEXCOORD7; |
|
half3 viewDir : TEXCOORD8; |
|
#else |
|
half fresnel : TEXCOORD7; |
|
#endif |
|
#endif |
|
|
|
}; |
|
|
|
v2f vert (appdata v) |
|
{ |
|
v2f o; |
|
float2 offset = 0; |
|
#ifdef USE_HEIGHT |
|
offset = _Time.xx * _HeightUVScrollDistort.xy; |
|
#endif |
|
|
|
#ifdef USE_MAINTEX |
|
o.mainUV = TRANSFORM_TEX(v.uv.xy, _MainTex) + offset; |
|
#endif |
|
|
|
#ifdef USE_BLENDING |
|
#if UNITY_VERSION == 600 |
|
o.uv.xy = TRANSFORM_TEX(v.uv.xy, _NormalTex) + offset; |
|
o.uv.zw = TRANSFORM_TEX(v.uv.zw, _NormalTex) + offset; |
|
o.blend = v.texcoordBlend; |
|
#else |
|
o.uv.xy = TRANSFORM_TEX(v.uv, _NormalTex) + offset; |
|
o.uv.zw = TRANSFORM_TEX(v.texcoordBlendFrame.xy, _NormalTex) + offset; |
|
o.blend = v.texcoordBlendFrame.z; |
|
#endif |
|
#else |
|
o.uv.xy = TRANSFORM_TEX(v.uv, _NormalTex) + offset; |
|
#endif |
|
|
|
#ifdef USE_HEIGHT |
|
float4 uv2 = float4(TRANSFORM_TEX(v.uv, _HeightTex) + offset, 0, 0); |
|
float4 tex = tex2Dlod (_HeightTex, uv2); |
|
v.vertex.xyz += v.normal * _Height * tex - v.normal * _Height / 2; |
|
#endif |
|
|
|
#ifdef USE_CUTOUT |
|
float2 pos = mul(_InverseTransformMatrix, float4(v.vertex.xyz, 1)).xz; |
|
o.uvCutout = (pos - 0.5) * _CutoutTex_ST.xy + _CutoutTex_ST.zw; |
|
#endif |
|
o.vertex = UnityObjectToClipPos(v.vertex); |
|
|
|
|
|
o.color = v.color; |
|
|
|
/////////////////////////////////////// GRABPASS //////////////////////////////////////// |
|
|
|
o.uvgrab.xy = GrabScreenPosXY(o.vertex); |
|
|
|
#ifdef USE_REFRACTIVE |
|
float3 binormal = cross(v.normal, v.tangent.xyz) * v.tangent.w; |
|
float3x3 rotation = float3x3(v.tangent.xyz, binormal, v.normal); |
|
o.uvgrab.xy += refract(normalize(mul(rotation, ObjSpaceViewDir(v.vertex))), 0, _RefractiveStrength) * v.color.a * v.color.a; |
|
#endif |
|
o.uvgrab.zw = o.vertex.w; |
|
#if UNITY_SINGLE_PASS_STEREO |
|
o.uvgrab.xy = TransformStereoScreenSpaceTex(o.uvgrab.xy, o.uvgrab.w); |
|
#endif |
|
o.uvgrab.z /= distance(_WorldSpaceCameraPos, mul(unity_ObjectToWorld, v.vertex)); |
|
|
|
#if defined (USE_SOFT_PARTICLES) && defined (SOFTPARTICLES_ON) |
|
o.projPos = ComputeScreenPos (o.vertex); |
|
COMPUTE_EYEDEPTH(o.projPos.z); |
|
#endif |
|
//////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
#ifdef USE_FRESNEL |
|
#if defined (USE_HEIGHT) |
|
o.localPos = v.vertex; |
|
o.viewDir = normalize(ObjSpaceViewDir(v.vertex)); |
|
#else |
|
o.fresnel = (1 - abs(dot(normalize(v.normal), normalize(ObjSpaceViewDir(v.vertex))))); |
|
o.fresnel = pow(o.fresnel, _FresnelPow); |
|
o.fresnel = saturate(_FresnelR0 + (1.0 - _FresnelR0) * o.fresnel); |
|
#endif |
|
#endif |
|
|
|
|
|
UNITY_TRANSFER_FOG(o,o.vertex); |
|
return o; |
|
} |
|
|
|
half4 frag (v2f i) : SV_Target |
|
{ |
|
|
|
#if DISTORT_OFF |
|
return 0; |
|
#endif |
|
|
|
#ifdef USE_BLENDING |
|
half4 dist1 = tex2D(_NormalTex, i.uv.xy); |
|
half4 dist2 = tex2D(_NormalTex, i.uv.zw); |
|
half3 dist = UnpackNormal(lerp(dist1, dist2, i.blend)); |
|
#else |
|
half3 dist = UnpackNormal(tex2D(_NormalTex, i.uv)); |
|
#endif |
|
|
|
#ifdef USE_ALPHA_CLIPING |
|
half alphaBump = saturate((abs(dist.r + dist.g) - 0.01) * _AlphaClip); |
|
clip(step(0.5, alphaBump) - 0.1); |
|
|
|
#endif |
|
|
|
#if defined (USE_SOFT_PARTICLES) && defined (SOFTPARTICLES_ON) |
|
float sceneZ = LinearEyeDepth (UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos)))); |
|
float partZ = i.projPos.z; |
|
half fade = saturate (_InvFade * (sceneZ-partZ)); |
|
half fadeStep = step(0.001, _InvFade); |
|
i.color.a *= lerp(1, fade, step(0.001, _InvFade)); |
|
#endif |
|
|
|
half2 texelSize = GetGrabTexelSize(); |
|
half2 offset = dist.rg * _Distortion * texelSize; |
|
|
|
half3 fresnelCol = 0; |
|
#ifdef USE_FRESNEL |
|
#if defined (USE_HEIGHT) |
|
#ifdef UNITY_UV_STARTS_AT_TOP |
|
half3 n = normalize(cross(ddx(i.localPos.xyz), ddy(i.localPos.xyz) * _ProjectionParams.x )); |
|
#else |
|
half3 n = normalize(cross(ddx(i.localPos.xyz), -ddy(i.localPos.xyz) * _ProjectionParams.x )); |
|
#endif |
|
half fresnel = (1 - dot(n, i.viewDir)); |
|
fresnel = pow(fresnel, _FresnelPow); |
|
fresnel = saturate(_FresnelR0 + (1.0 - _FresnelR0) * fresnel); |
|
offset += fresnel * texelSize * _FresnelDistort * dist.rg ; |
|
fresnelCol = _FresnelColor * fresnel * abs(dist.r + dist.g) * 2 * i.color.rgb * i.color.a; |
|
#else |
|
offset += i.fresnel * texelSize * _FresnelDistort * dist.rg; |
|
fresnelCol = _FresnelColor * i.fresnel * abs(dist.r + dist.g) * 2 * i.color.rgb * i.color.a; |
|
#endif |
|
#endif |
|
|
|
half4 cutoutCol = 0; |
|
cutoutCol.a = 1; |
|
#ifdef USE_CUTOUT |
|
half cutoutAlpha = tex2D(_CutoutTex, i.uvCutout).r - (dist.r + dist.g) / 10; |
|
half alpha = step(0, (_Cutout - cutoutAlpha)); |
|
half alpha2 = step(0, (_Cutout - cutoutAlpha + _CutoutThreshold)); |
|
cutoutCol.rgb = _CutoutColor * saturate(alpha2 - alpha); |
|
cutoutCol.a = alpha2 * pow(_Cutout, 0.2); |
|
#endif |
|
|
|
#ifdef USE_ALPHA_CLIPING |
|
offset *= alphaBump; |
|
#endif |
|
i.uvgrab.xy = offset * i.uvgrab.z * i.color.a + i.uvgrab.xy; |
|
half4 grabColor = tex2Dproj(_GrabTexture, UNITY_PROJ_COORD(i.uvgrab));; |
|
|
|
half4 result; |
|
result.rgb = grabColor * lerp(1, _MainColor, i.color.a) + fresnelCol * grabColor + cutoutCol.rgb; |
|
|
|
#ifdef USE_MAINTEX |
|
half4 mainCol = tex2D(_MainTex, i.mainUV - offset / _TintColor.a); |
|
result.rgb += mainCol.rgb * mainCol.a * _TintColor.rgb * i.color.a; |
|
#endif |
|
result.a = lerp(saturate(dot(fresnelCol, 0.33)*10) * _FresnelColor.a, _MainColor.a , _MainColor.a)* cutoutCol.a; |
|
#ifdef DISTORT_ON |
|
result.a *= i.color.a; |
|
#endif |
|
#ifdef USE_ALPHA_CLIPING |
|
result.a *= alphaBump; |
|
#endif |
|
|
|
//UNITY_APPLY_FOG(i.fogCoord, result); |
|
result.a = saturate(result.a); |
|
return result; |
|
} |