diff --git a/com.microsoft.mrtk.graphicstools.unity/Runtime/Shaders/GraphicsToolsLighting.hlsl b/com.microsoft.mrtk.graphicstools.unity/Runtime/Shaders/GraphicsToolsLighting.hlsl index a3511fc1..7c26bbda 100644 --- a/com.microsoft.mrtk.graphicstools.unity/Runtime/Shaders/GraphicsToolsLighting.hlsl +++ b/com.microsoft.mrtk.graphicstools.unity/Runtime/Shaders/GraphicsToolsLighting.hlsl @@ -17,7 +17,7 @@ struct GTMainLight GTMainLight GTGetMainLight() { GTMainLight light; -#if defined(_DIRECTIONAL_LIGHT) || defined(_DISTANT_LIGHT) +#if defined(_DIRECTIONAL_LIGHT) || defined(_DISTANT_LIGHT) || defined(_SHADOW_PASS) #if defined(_DISTANT_LIGHT) light.direction = _DistantLightData[0].xyz; light.color = _DistantLightData[1].xyz; diff --git a/com.microsoft.mrtk.graphicstools.unity/Runtime/Shaders/GraphicsToolsStandard.shader b/com.microsoft.mrtk.graphicstools.unity/Runtime/Shaders/GraphicsToolsStandard.shader index 1ccc7e6b..89102237 100644 --- a/com.microsoft.mrtk.graphicstools.unity/Runtime/Shaders/GraphicsToolsStandard.shader +++ b/com.microsoft.mrtk.graphicstools.unity/Runtime/Shaders/GraphicsToolsStandard.shader @@ -189,6 +189,30 @@ Shader "Graphics Tools/Standard" ENDHLSL } + Pass + { + Name "ShadowCaster" + Tags{"LightMode" = "ShadowCaster"} + + ZWrite On + ZTest LEqual + ColorMask 0 + Cull[_CullMode] + + HLSLPROGRAM + + #define _URP + #define _SHADOW_PASS + + #pragma multi_compile_instancing + + #pragma shader_feature_local_fragment _CLIPPING_BORDER + + #include_with_pragmas "GraphicsToolsStandardProgram.hlsl" + + ENDHLSL + } + // Extracts information for lightmapping, GI (emission, albedo, ...) // This pass it not used during regular rendering. Pass diff --git a/com.microsoft.mrtk.graphicstools.unity/Runtime/Shaders/GraphicsToolsStandardProgram.hlsl b/com.microsoft.mrtk.graphicstools.unity/Runtime/Shaders/GraphicsToolsStandardProgram.hlsl index 0077493b..0a6f51bd 100644 --- a/com.microsoft.mrtk.graphicstools.unity/Runtime/Shaders/GraphicsToolsStandardProgram.hlsl +++ b/com.microsoft.mrtk.graphicstools.unity/Runtime/Shaders/GraphicsToolsStandardProgram.hlsl @@ -8,7 +8,7 @@ #pragma fragment PixelStage // Comment in to help with RenderDoc debugging. -//#pragma enable_d3d11_debug_symbols +#pragma enable_d3d11_debug_symbols /// /// Features. @@ -16,37 +16,41 @@ #pragma multi_compile_local _ _CLIPPING_PLANE _CLIPPING_SPHERE _CLIPPING_BOX -#pragma shader_feature_local _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHABLEND_TRANS_ON _ADDITIVE_ON +#pragma shader_feature_local _ _ALPHATEST_ON #pragma shader_feature_local _DISABLE_ALBEDO_MAP #pragma shader_feature_local_fragment _ _METALLIC_TEXTURE_ALBEDO_CHANNEL_A _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A #pragma shader_feature_local _CHANNEL_MAP +#pragma shader_feature_local _ _DIRECTIONAL_LIGHT _DISTANT_LIGHT +#pragma shader_feature_local _VERTEX_COLORS +#pragma shader_feature_local _VERTEX_EXTRUSION +#pragma shader_feature_local_vertex _VERTEX_EXTRUSION_SMOOTH_NORMALS +#pragma shader_feature_local_vertex _VERTEX_EXTRUSION_CONSTANT_WIDTH +#pragma shader_feature_local _NEAR_PLANE_FADE +#pragma shader_feature_local_vertex _NEAR_LIGHT_FADE +#pragma shader_feature_local _ROUND_CORNERS +#pragma shader_feature_local_fragment _INDEPENDENT_CORNERS +#pragma shader_feature_local_fragment _ROUND_CORNERS_HIDE_INTERIOR +#pragma shader_feature_local_fragment _ _EDGE_SMOOTHING_AUTOMATIC +#pragma shader_feature_local _USE_WORLD_SCALE + +#if !defined(_SHADOW_PASS) +#pragma shader_feature_local _ _ALPHABLEND_ON _ALPHABLEND_TRANS_ON _ADDITIVE_ON #pragma shader_feature_local _NORMAL_MAP #pragma shader_feature_local _EMISSION #pragma shader_feature_local _TRIPLANAR_MAPPING #pragma shader_feature_local _LOCAL_SPACE_TRIPLANAR_MAPPING #pragma shader_feature_local_fragment _USE_SSAA -#pragma shader_feature_local _ _DIRECTIONAL_LIGHT _DISTANT_LIGHT #pragma shader_feature_local _NON_PHOTOREALISTIC #pragma shader_feature_local_fragment _SPECULAR_HIGHLIGHTS #pragma shader_feature_local _SPHERICAL_HARMONICS #pragma shader_feature_local _REFLECTIONS #pragma shader_feature_local _RIM_LIGHT -#pragma shader_feature_local _VERTEX_COLORS -#pragma shader_feature_local _VERTEX_EXTRUSION -#pragma shader_feature_local_vertex _VERTEX_EXTRUSION_SMOOTH_NORMALS -#pragma shader_feature_local_vertex _VERTEX_EXTRUSION_CONSTANT_WIDTH -#pragma shader_feature_local _NEAR_PLANE_FADE -#pragma shader_feature_local_vertex _NEAR_LIGHT_FADE #pragma shader_feature_local _HOVER_LIGHT #pragma shader_feature_local_fragment _HOVER_COLOR_OVERRIDE #pragma shader_feature_local _PROXIMITY_LIGHT #pragma shader_feature_local_fragment _PROXIMITY_LIGHT_COLOR_OVERRIDE #pragma shader_feature_local_fragment _PROXIMITY_LIGHT_SUBTRACTIVE #pragma shader_feature_local _PROXIMITY_LIGHT_TWO_SIDED -#pragma shader_feature_local _ROUND_CORNERS -#pragma shader_feature_local_fragment _INDEPENDENT_CORNERS -#pragma shader_feature_local_fragment _ROUND_CORNERS_HIDE_INTERIOR -#pragma shader_feature_local_fragment _ _EDGE_SMOOTHING_AUTOMATIC #pragma shader_feature_local _BORDER_LIGHT #pragma shader_feature_local_fragment _ _BORDER_LIGHT_USES_HOVER_COLOR _BORDER_LIGHT_USES_COLOR _BORDER_LIGHT_USES_GRADIENT #pragma shader_feature_local_fragment _BORDER_LIGHT_REPLACES_ALBEDO @@ -55,7 +59,7 @@ #pragma shader_feature_local _ _IRIDESCENCE _GRADIENT_FOUR_POINT _GRADIENT_LINEAR #pragma shader_feature_local _ENVIRONMENT_COLORING #pragma shader_feature_local _ _BLUR_TEXTURE _BLUR_TEXTURE_2 _BLUR_TEXTURE_PREBAKED_BACKGROUND -#pragma shader_feature_local _USE_WORLD_SCALE +#endif /// /// Defines and includes. @@ -169,7 +173,7 @@ Varyings VertexStage(Attributes input) #endif #endif #endif - + half3 localNormal = input.normal; #if defined(_NORMAL) || defined(_VERTEX_EXTRUSION) @@ -244,28 +248,21 @@ Varyings VertexStage(Attributes input) #if defined(_BORDER_LIGHT) || defined(_ROUND_CORNERS) output.uv = input.uv; - -#if defined(_USE_WORLD_SCALE) - output.scale.z = canvasScale; - #else - float minScale = min(min(output.scale.x, output.scale.y), output.scale.z); -#endif - + if (abs(localNormal.x) == 1.0) // Y,Z plane. { output.scale.x = output.scale.z; - output.scale.y = output.scale.y; } else if (abs(localNormal.y) == 1.0) // X,Z plane. { - output.scale.x = output.scale.x; output.scale.y = output.scale.z; - } - // Else X,Y plane. - -#if !defined(_USE_WORLD_SCALE) - output.scale.z = minScale; -#endif + } // Else X,Y plane. + + #if defined(_USE_WORLD_SCALE) + output.scale.z = canvasScale; + #else + output.scale.z = min(min(output.scale.x, output.scale.y), output.scale.z); + #endif #elif defined(_UV) output.uv = TRANSFORM_TEX(input.uv, _MainTex); @@ -516,7 +513,7 @@ half4 PixelStage(Varyings input, bool facing : SV_IsFrontFace) : SV_Target _RoundCornersRadius = clamp(_RoundCornersRadius, 0.0h, 0.5h); #endif currentCornerRadius = GTFindCornerRadius(input.uv.xy, _RoundCornersRadius); -#else +#else currentCornerRadius = _RoundCornerRadius; #endif #else @@ -763,6 +760,11 @@ half4 PixelStage(Varyings input, bool facing : SV_IsFrontFace) : SV_Target albedo.a = 1.0; #endif +#if defined(_SHADOW_PASS) + // Return early to avoid unnecessary calculations for shadow pass. + return 0; +#endif + // Final lighting mix. half4 output = albedo;