Shader "Hidden/Universal Render Pipeline/FinalPost" { HLSLINCLUDE #pragma exclude_renderers gles #pragma multi_compile_local_fragment _ _POINT_SAMPLING _RCAS #pragma multi_compile_local_fragment _ _FXAA #pragma multi_compile_local_fragment _ _FILM_GRAIN #pragma multi_compile_local_fragment _ _DITHERING #pragma multi_compile_local_fragment _ _LINEAR_TO_SRGB_CONVERSION #pragma multi_compile _ _USE_DRAW_PROCEDURAL #pragma multi_compile_fragment _ DEBUG_DISPLAY #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Debug/DebuggingFullscreen.hlsl" #include "Packages/com.unity.render-pipelines.universal/Shaders/PostProcessing/Common.hlsl" TEXTURE2D_X(_SourceTex); TEXTURE2D(_Grain_Texture); TEXTURE2D(_BlueNoise_Texture); float4 _SourceSize; float2 _Grain_Params; float4 _Grain_TilingParams; float4 _Dithering_Params; #if SHADER_TARGET >= 45 #define FSR_INPUT_TEXTURE _SourceTex #define FSR_INPUT_SAMPLER sampler_LinearClamp #include "Packages/com.unity.render-pipelines.core/Runtime/PostProcessing/Shaders/FSRCommon.hlsl" #endif #define GrainIntensity _Grain_Params.x #define GrainResponse _Grain_Params.y #define GrainScale _Grain_TilingParams.xy #define GrainOffset _Grain_TilingParams.zw #define DitheringScale _Dithering_Params.xy #define DitheringOffset _Dithering_Params.zw half4 Frag(Varyings input) : SV_Target { UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); float2 uv = UnityStereoTransformScreenSpaceTex(input.uv); float2 positionNDC = uv; int2 positionSS = uv * _SourceSize.xy; #if _POINT_SAMPLING half3 color = SAMPLE_TEXTURE2D_X(_SourceTex, sampler_PointClamp, uv).xyz; #elif _RCAS && SHADER_TARGET >= 45 half3 color = ApplyRCAS(positionSS); // When Unity is configured to use gamma color encoding, we must convert back from linear after RCAS is performed. // (The input color data for this shader variant is always linearly encoded because RCAS requires it) #if UNITY_COLORSPACE_GAMMA color = GetLinearToSRGB(color); #endif #else half3 color = SAMPLE_TEXTURE2D_X(_SourceTex, sampler_LinearClamp, uv).xyz; #endif #if _FXAA { color = ApplyFXAA(color, positionNDC, positionSS, _SourceSize, _SourceTex); } #endif #if _FILM_GRAIN { color = ApplyGrain(color, positionNDC, TEXTURE2D_ARGS(_Grain_Texture, sampler_LinearRepeat), GrainIntensity, GrainResponse, GrainScale, GrainOffset); } #endif #if _LINEAR_TO_SRGB_CONVERSION { color = LinearToSRGB(color); } #endif #if _DITHERING { color = ApplyDithering(color, positionNDC, TEXTURE2D_ARGS(_BlueNoise_Texture, sampler_PointRepeat), DitheringScale, DitheringOffset); } #endif half4 finalColor = half4(color, 1); #if defined(DEBUG_DISPLAY) half4 debugColor = 0; if(CanDebugOverrideOutputColor(finalColor, uv, debugColor)) { return debugColor; } #endif return finalColor; } ENDHLSL /// Standard FinalPost shader variant with support for FSR /// Note: FSR requires shader target 4.5 because it relies on texture gather instructions SubShader { Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline"} LOD 100 ZTest Always ZWrite Off Cull Off Pass { Name "FinalPost" HLSLPROGRAM #pragma vertex FullscreenVert #pragma fragment Frag #pragma target 4.5 ENDHLSL } } /// Fallback version of FinalPost shader which lacks support for FSR SubShader { Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline"} LOD 100 ZTest Always ZWrite Off Cull Off Pass { Name "FinalPost" HLSLPROGRAM #pragma vertex FullscreenVert #pragma fragment Frag ENDHLSL } } }