196 lines
7.7 KiB
Plaintext
196 lines
7.7 KiB
Plaintext
|
Shader "Hidden/Universal Render Pipeline/FinalPost"
|
||
|
{
|
||
|
HLSLINCLUDE
|
||
|
#pragma multi_compile_local_fragment _ _POINT_SAMPLING _RCAS _EASU_RCAS_AND_HDR_INPUT
|
||
|
#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_local_fragment _ _ENABLE_ALPHA_OUTPUT
|
||
|
#pragma multi_compile_fragment _ DEBUG_DISPLAY
|
||
|
#pragma multi_compile_fragment _ SCREEN_COORD_OVERRIDE
|
||
|
#pragma multi_compile_local_fragment _ HDR_INPUT HDR_COLORSPACE_CONVERSION HDR_ENCODING HDR_COLORSPACE_CONVERSION_AND_ENCODING
|
||
|
|
||
|
#pragma dynamic_branch_local_fragment _ _HDR_OVERLAY
|
||
|
|
||
|
#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.core/ShaderLibrary/ScreenCoordOverride.hlsl"
|
||
|
#if defined(HDR_COLORSPACE_CONVERSION) || defined(HDR_ENCODING) || defined(HDR_COLORSPACE_CONVERSION_AND_ENCODING)
|
||
|
#define HDR_INPUT 1 // this should be defined when HDR_COLORSPACE_CONVERSION or HDR_ENCODING are defined
|
||
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/HDROutput.hlsl"
|
||
|
#endif
|
||
|
#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(_Grain_Texture);
|
||
|
TEXTURE2D(_BlueNoise_Texture);
|
||
|
TEXTURE2D_X(_OverlayUITexture);
|
||
|
|
||
|
float4 _SourceSize;
|
||
|
float2 _Grain_Params;
|
||
|
float4 _Grain_TilingParams;
|
||
|
float4 _Dithering_Params;
|
||
|
float4 _HDROutputLuminanceParams;
|
||
|
|
||
|
#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
|
||
|
|
||
|
#define MinNits _HDROutputLuminanceParams.x
|
||
|
#define MaxNits _HDROutputLuminanceParams.y
|
||
|
#define PaperWhite _HDROutputLuminanceParams.z
|
||
|
#define OneOverPaperWhite _HDROutputLuminanceParams.w
|
||
|
|
||
|
#if SHADER_TARGET >= 45
|
||
|
#define FSR_INPUT_TEXTURE _BlitTexture
|
||
|
#define FSR_INPUT_SAMPLER sampler_LinearClamp
|
||
|
|
||
|
// If HDR_INPUT is defined, we must also define FSR_EASU_ONE_OVER_PAPER_WHITE before including the FSR common header.
|
||
|
// URP doesn't actually uses EASU from finalPost shader, only RCAS.
|
||
|
#define FSR_EASU_ONE_OVER_PAPER_WHITE OneOverPaperWhite
|
||
|
#include "Packages/com.unity.render-pipelines.core/Runtime/PostProcessing/Shaders/FSRCommon.hlsl"
|
||
|
#endif
|
||
|
|
||
|
half4 FragFinalPost(Varyings input) : SV_Target
|
||
|
{
|
||
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
|
||
|
|
||
|
float2 uv = UnityStereoTransformScreenSpaceTex(input.texcoord);
|
||
|
float2 positionNDC = uv;
|
||
|
int2 positionSS = uv * _SourceSize.xy;
|
||
|
|
||
|
#if _POINT_SAMPLING
|
||
|
// Hlsl specifies missing input.a to fill 1 (0 for .rgb).
|
||
|
half4 color = SAMPLE_TEXTURE2D_X(_BlitTexture, sampler_PointClamp, uv);
|
||
|
#elif (_RCAS || _EASU_RCAS_AND_HDR_INPUT) && SHADER_TARGET >= 45
|
||
|
half4 color = half4(ApplyRCAS(positionSS), 1.0);
|
||
|
// 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 _EASU_RCAS_AND_HDR_INPUT
|
||
|
// Revert operation from ScalingSetup.shader
|
||
|
color.rgb = FastTonemapInvert(color.rgb) * PaperWhite;
|
||
|
#endif
|
||
|
#if UNITY_COLORSPACE_GAMMA
|
||
|
color = GetLinearToSRGB(color);
|
||
|
#endif
|
||
|
#if _ENABLE_ALPHA_OUTPUT
|
||
|
color.a = SAMPLE_TEXTURE2D_X(_BlitTexture, sampler_LinearClamp, uv).a;
|
||
|
#endif
|
||
|
#else
|
||
|
half4 color = SAMPLE_TEXTURE2D_X(_BlitTexture, sampler_LinearClamp, uv);
|
||
|
#endif
|
||
|
|
||
|
#if _FXAA
|
||
|
{
|
||
|
#if _ENABLE_ALPHA_OUTPUT
|
||
|
// When alpha processing is enabled, FXAA should not affect pixels with zero alpha
|
||
|
UNITY_BRANCH
|
||
|
if(color.a > 0)
|
||
|
color.rgb = ApplyFXAA(color.rgb, positionNDC, positionSS, _SourceSize, _BlitTexture, PaperWhite, OneOverPaperWhite);
|
||
|
#else
|
||
|
color.rgb = ApplyFXAA(color.rgb, positionNDC, positionSS, _SourceSize, _BlitTexture, PaperWhite, OneOverPaperWhite);
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#if _FILM_GRAIN
|
||
|
{
|
||
|
color.rgb = ApplyGrain(color.rgb, SCREEN_COORD_APPLY_SCALEBIAS(positionNDC), TEXTURE2D_ARGS(_Grain_Texture, sampler_LinearRepeat), GrainIntensity, GrainResponse, GrainScale, GrainOffset, OneOverPaperWhite);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#if _LINEAR_TO_SRGB_CONVERSION
|
||
|
{
|
||
|
color = LinearToSRGB(color);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#if _DITHERING
|
||
|
{
|
||
|
color.rgb = ApplyDithering(color.rgb, SCREEN_COORD_APPLY_SCALEBIAS(positionNDC), TEXTURE2D_ARGS(_BlueNoise_Texture, sampler_PointRepeat), DitheringScale, DitheringOffset, PaperWhite, OneOverPaperWhite);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef HDR_COLORSPACE_CONVERSION
|
||
|
{
|
||
|
color.rgb = RotateRec709ToOutputSpace(color.rgb) * PaperWhite;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef HDR_ENCODING
|
||
|
{
|
||
|
UNITY_BRANCH if(_HDR_OVERLAY)
|
||
|
{
|
||
|
float4 uiSample = SAMPLE_TEXTURE2D_X(_OverlayUITexture, sampler_PointClamp, input.texcoord);
|
||
|
color.rgb = SceneUIComposition(uiSample, color.rgb, PaperWhite, MaxNits);
|
||
|
}
|
||
|
|
||
|
color.rgb = OETF(color.rgb, MaxNits);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#if _ENABLE_ALPHA_OUTPUT
|
||
|
half4 finalColor = color;
|
||
|
#else
|
||
|
half4 finalColor = half4(color.rgb, 1.0);
|
||
|
#endif
|
||
|
|
||
|
#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 Vert
|
||
|
#pragma fragment FragFinalPost
|
||
|
#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 Vert
|
||
|
#pragma fragment FragFinalPost
|
||
|
ENDHLSL
|
||
|
}
|
||
|
}
|
||
|
}
|