diff options
Diffstat (limited to 'Assets/ThirdParty/MaterializeFX/Shaders/Standart/UnityStandardShadow.cginc')
-rw-r--r-- | Assets/ThirdParty/MaterializeFX/Shaders/Standart/UnityStandardShadow.cginc | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/Assets/ThirdParty/MaterializeFX/Shaders/Standart/UnityStandardShadow.cginc b/Assets/ThirdParty/MaterializeFX/Shaders/Standart/UnityStandardShadow.cginc new file mode 100644 index 00000000..0f716cc3 --- /dev/null +++ b/Assets/ThirdParty/MaterializeFX/Shaders/Standart/UnityStandardShadow.cginc @@ -0,0 +1,233 @@ +// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)
+
+#ifndef UNITY_STANDARD_SHADOW_INCLUDED
+#define UNITY_STANDARD_SHADOW_INCLUDED
+
+// NOTE: had to split shadow functions into separate file,
+// otherwise compiler gives trouble with LIGHTING_COORDS macro (in UnityStandardCore.cginc)
+
+#include "UnityCG.cginc"
+#include "UnityShaderVariables.cginc"
+#include "UnityInstancing.cginc"
+#include "UnityStandardConfig.cginc"
+#include "UnityStandardUtils.cginc"
+
+#if (defined(_ALPHABLEND_ON) || defined(_ALPHAPREMULTIPLY_ON)) && defined(UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS)
+ #define UNITY_STANDARD_USE_DITHER_MASK 1
+#endif
+
+// Need to output UVs in shadow caster, since we need to sample texture and do clip/dithering based on it
+#if defined(_ALPHATEST_ON) || defined(_ALPHABLEND_ON) || defined(_ALPHAPREMULTIPLY_ON)
+#define UNITY_STANDARD_USE_SHADOW_UVS 1
+#endif
+
+// Has a non-empty shadow caster output struct (it's an error to have empty structs on some platforms...)
+#if !defined(V2F_SHADOW_CASTER_NOPOS_IS_EMPTY) || defined(UNITY_STANDARD_USE_SHADOW_UVS)
+#define UNITY_STANDARD_USE_SHADOW_OUTPUT_STRUCT 1
+#endif
+
+#ifdef UNITY_STEREO_INSTANCING_ENABLED
+#define UNITY_STANDARD_USE_STEREO_SHADOW_OUTPUT_STRUCT 1
+#endif
+
+
+half4 _Color;
+half _Cutoff;
+sampler2D _MainTex;
+float4 _MainTex_ST;
+#ifdef UNITY_STANDARD_USE_DITHER_MASK
+sampler3D _DitherMaskLOD;
+#endif
+
+// Handle PremultipliedAlpha from Fade or Transparent shading mode
+half4 _SpecColor;
+half _Metallic;
+#ifdef _SPECGLOSSMAP
+sampler2D _SpecGlossMap;
+#endif
+#ifdef _METALLICGLOSSMAP
+sampler2D _MetallicGlossMap;
+#endif
+
+#if defined(UNITY_STANDARD_USE_SHADOW_UVS) && defined(_PARALLAXMAP)
+sampler2D _ParallaxMap;
+half _Parallax;
+#endif
+
+//MFX
+#include "Assets/MaterializeFX/Shaders/cginc/MFX.cginc"
+
+half MetallicSetup_ShadowGetOneMinusReflectivity(half2 uv)
+{
+ half metallicity = _Metallic;
+ #ifdef _METALLICGLOSSMAP
+ metallicity = tex2D(_MetallicGlossMap, uv).r;
+ #endif
+ return OneMinusReflectivityFromMetallic(metallicity);
+}
+
+half RoughnessSetup_ShadowGetOneMinusReflectivity(half2 uv)
+{
+ half metallicity = _Metallic;
+#ifdef _METALLICGLOSSMAP
+ metallicity = tex2D(_MetallicGlossMap, uv).r;
+#endif
+ return OneMinusReflectivityFromMetallic(metallicity);
+}
+
+half SpecularSetup_ShadowGetOneMinusReflectivity(half2 uv)
+{
+ half3 specColor = _SpecColor.rgb;
+ #ifdef _SPECGLOSSMAP
+ specColor = tex2D(_SpecGlossMap, uv).rgb;
+ #endif
+ return (1 - SpecularStrength(specColor));
+}
+
+// SHADOW_ONEMINUSREFLECTIVITY(): workaround to get one minus reflectivity based on UNITY_SETUP_BRDF_INPUT
+#define SHADOW_JOIN2(a, b) a##b
+#define SHADOW_JOIN(a, b) SHADOW_JOIN2(a,b)
+#define SHADOW_ONEMINUSREFLECTIVITY SHADOW_JOIN(UNITY_SETUP_BRDF_INPUT, _ShadowGetOneMinusReflectivity)
+
+struct VertexInput
+{
+ float4 vertex : POSITION;
+ float3 normal : NORMAL;
+ float2 uv0 : TEXCOORD0;
+ #if defined(UNITY_STANDARD_USE_SHADOW_UVS) && defined(_PARALLAXMAP)
+ half4 tangent : TANGENT;
+ #endif
+ UNITY_VERTEX_INPUT_INSTANCE_ID
+};
+
+#ifdef UNITY_STANDARD_USE_SHADOW_OUTPUT_STRUCT
+struct VertexOutputShadowCaster
+{
+ V2F_SHADOW_CASTER_NOPOS
+ #if defined(UNITY_STANDARD_USE_SHADOW_UVS)
+ float2 tex : TEXCOORD1;
+
+ #if defined(_PARALLAXMAP)
+ half3 viewDirForParallax : TEXCOORD2;
+ #endif
+ #endif
+
+ //MFX
+ float4 mfxUv : TEXCOORD5;
+ float3 worldPos : TEXCOORD6;
+};
+#endif
+
+#ifdef UNITY_STANDARD_USE_STEREO_SHADOW_OUTPUT_STRUCT
+struct VertexOutputStereoShadowCaster
+{
+ UNITY_VERTEX_OUTPUT_STEREO
+
+ //MFX
+ float4 mfxUv : TEXCOORD5;
+ float3 worldPos : TEXCOORD6;
+};
+#endif
+
+// We have to do these dances of outputting SV_POSITION separately from the vertex shader,
+// and inputting VPOS in the pixel shader, since they both map to "POSITION" semantic on
+// some platforms, and then things don't go well.
+
+
+void vertShadowCaster (VertexInput v
+ , out float4 opos : SV_POSITION
+ #ifdef UNITY_STANDARD_USE_SHADOW_OUTPUT_STRUCT
+ , out VertexOutputShadowCaster o
+ #endif
+ #ifdef UNITY_STANDARD_USE_STEREO_SHADOW_OUTPUT_STRUCT
+ , out VertexOutputStereoShadowCaster os
+ #endif
+)
+{
+ UNITY_SETUP_INSTANCE_ID(v);
+
+ #ifdef UNITY_STANDARD_USE_SHADOW_OUTPUT_STRUCT
+ UNITY_INITIALIZE_OUTPUT(VertexOutputShadowCaster, o);
+ #endif
+
+ #ifdef UNITY_STANDARD_USE_STEREO_SHADOW_OUTPUT_STRUCT
+ UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(os);
+ #endif
+ TRANSFER_SHADOW_CASTER_NOPOS(o,opos)
+ #if defined(UNITY_STANDARD_USE_SHADOW_UVS)
+ o.tex = TRANSFORM_TEX(v.uv0, _MainTex);
+
+ #ifdef _PARALLAXMAP
+ TANGENT_SPACE_ROTATION;
+ o.viewDirForParallax = mul (rotation, ObjSpaceViewDir(v.vertex));
+ #endif
+ #endif
+
+#ifdef UNITY_STANDARD_USE_SHADOW_OUTPUT_STRUCT
+ //MFX
+ PassMfxVertex2Fragment(v.uv0.xy, o.mfxUv);
+ o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
+#endif
+#ifdef UNITY_STANDARD_USE_STEREO_SHADOW_OUTPUT_STRUCT
+ //MFX
+ PassMfxVertex2Fragment(v.uv0.xy, os.mfxUv);
+ os.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
+#endif
+}
+
+
+half4 fragShadowCaster (UNITY_POSITION(vpos)
+#ifdef UNITY_STANDARD_USE_SHADOW_OUTPUT_STRUCT
+ , VertexOutputShadowCaster i
+#endif
+) : SV_Target
+{
+ #if defined(UNITY_STANDARD_USE_SHADOW_UVS)
+ #if defined(_PARALLAXMAP) && (SHADER_TARGET >= 30)
+ half3 viewDirForParallax = normalize(i.viewDirForParallax);
+ fixed h = tex2D (_ParallaxMap, i.tex.xy).g;
+ half2 offset = ParallaxOffset1Step (h, _Parallax, viewDirForParallax);
+ i.tex.xy += offset;
+ #endif
+
+ //MFX
+ half alpha = GetMfxDissolve(i.mfxUv, i.worldPos);
+ MfxClip(alpha);
+
+ // half alpha = tex2D(_MainTex, i.tesx).a * _Color.a;
+ // #if defined(_ALPHATEST_ON)
+ // clip (alpha - _Cutoff);
+ // #endif
+ // #if defined(_ALPHABLEND_ON) || defined(_ALPHAPREMULTIPLY_ON)
+ // #if defined(_ALPHAPREMULTIPLY_ON)
+ // half outModifiedAlpha;
+ // PreMultiplyAlpha(half3(0, 0, 0), alpha, SHADOW_ONEMINUSREFLECTIVITY(i.tex), outModifiedAlpha);
+ // alpha = outModifiedAlpha;
+ // #endif
+ // #if defined(UNITY_STANDARD_USE_DITHER_MASK)
+ // // Use dither mask for alpha blended shadows, based on pixel position xy
+ // // and alpha level. Our dither texture is 4x4x16.
+ // #ifdef LOD_FADE_CROSSFADE
+ // #define _LOD_FADE_ON_ALPHA
+ // alpha *= unity_LODFade.y;
+ // #endif
+ // half alphaRef = tex3D(_DitherMaskLOD, float3(vpos.xy*0.25,alpha*0.9375)).a;
+ // clip (alphaRef - 0.01);
+ // #else
+ // clip (alpha - _Cutoff);
+ // #endif
+ // #endif
+ #endif // #if defined(UNITY_STANDARD_USE_SHADOW_UVS)
+
+ #ifdef LOD_FADE_CROSSFADE
+ #ifdef _LOD_FADE_ON_ALPHA
+ #undef _LOD_FADE_ON_ALPHA
+ #else
+ UnityApplyDitherCrossFade(vpos.xy);
+ #endif
+ #endif
+
+ SHADOW_CASTER_FRAGMENT(i)
+}
+
+#endif // UNITY_STANDARD_SHADOW_INCLUDED
|