231 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			HLSL
		
	
	
	
			
		
		
	
	
			231 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			HLSL
		
	
	
	
| // Curved World <http://u3d.as/1W8h>
 | |
| // Copyright (c) Amazing Assets <https://amazingassets.world>
 | |
|  
 | |
| 
 | |
| 
 | |
| #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 "UnityStandardConfig.cginc"
 | |
| #include "UnityStandardUtils.cginc"
 | |
| 
 | |
| 
 | |
| #include "../../Core/CurvedWorldTransform.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
 | |
| 
 | |
| 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
 | |
| };
 | |
| 
 | |
| struct VertexOutput
 | |
| {
 | |
|     UNITY_POSITION(pos);
 | |
|     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
 | |
| };
 | |
| #endif
 | |
| 
 | |
| #ifdef UNITY_STANDARD_USE_STEREO_SHADOW_OUTPUT_STRUCT
 | |
| struct VertexOutputStereoShadowCaster
 | |
| {
 | |
|     UNITY_VERTEX_OUTPUT_STEREO
 | |
| };
 | |
| #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 VertexOutput output
 | |
|     #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);
 | |
|     UNITY_TRANSFER_INSTANCE_ID(v, output);
 | |
| 
 | |
|     #ifdef UNITY_STANDARD_USE_STEREO_SHADOW_OUTPUT_STRUCT
 | |
|         UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(os);
 | |
|     #endif
 | |
| 
 | |
| 
 | |
|     //Curved World
 | |
|     #if defined(CURVEDWORLD_IS_INSTALLED) && !defined(CURVEDWORLD_DISABLED_ON)
 | |
|         CURVEDWORLD_TRANSFORM_VERTEX(v.vertex);
 | |
|     #endif
 | |
| 
 | |
| 
 | |
|     TRANSFER_SHADOW_CASTER_NOPOS(o, output.pos)
 | |
|     #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
 | |
| }
 | |
| 
 | |
| half4 fragShadowCaster (VertexOutput input
 | |
| #ifdef UNITY_STANDARD_USE_SHADOW_OUTPUT_STRUCT
 | |
|     , VertexOutputShadowCaster i
 | |
| #endif
 | |
| ) : SV_Target
 | |
| {
 | |
|     UNITY_SETUP_INSTANCE_ID(input);
 | |
| 
 | |
|     #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
 | |
| 
 | |
|         #if defined(_SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A)
 | |
|             half alpha = _Color.a;
 | |
|         #else
 | |
|             half alpha = tex2D(_MainTex, i.tex.xy).a * _Color.a;
 | |
|         #endif
 | |
|         #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(input.pos.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(input.pos.xy);
 | |
|         #endif
 | |
|     #endif
 | |
| 
 | |
|     SHADOW_CASTER_FRAGMENT(i)
 | |
| }
 | |
| 
 | |
| #endif // UNITY_STANDARD_SHADOW_INCLUDED
 |