From 917e9e0b320775634dc2e710f7deac74fd0822f0 Mon Sep 17 00:00:00 2001 From: chai Date: Thu, 22 Oct 2020 23:30:02 +0800 Subject: * amplify shader editor --- .../Shaders/Standart/UnityStandardShadow.cginc | 233 +++++++++++++++++++++ 1 file changed, 233 insertions(+) create mode 100644 Assets/MaterializeFX/Shaders/Standart/UnityStandardShadow.cginc (limited to 'Assets/MaterializeFX/Shaders/Standart/UnityStandardShadow.cginc') diff --git a/Assets/MaterializeFX/Shaders/Standart/UnityStandardShadow.cginc b/Assets/MaterializeFX/Shaders/Standart/UnityStandardShadow.cginc new file mode 100644 index 00000000..0f716cc3 --- /dev/null +++ b/Assets/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 -- cgit v1.1-26-g67d0