study/first_study/Library/PackageCache/com.unity.render-pipelines.universal@d10049dfa479/Runtime/RendererFeatures/OnTileUberPost.shader
jh04010421 739d49f1a0 Unity | 2026.01.20
수업 실습 파일
2026-01-20 11:01:57 +09:00

341 lines
14 KiB
Plaintext

Shader "OnTileUberPost"
{
HLSLINCLUDE
#pragma multi_compile_local_fragment _ _HDR_GRADING _TONEMAP_ACES _TONEMAP_NEUTRAL
#pragma multi_compile_local_fragment _ _FILM_GRAIN
#pragma multi_compile_local_fragment _ _DITHERING
#pragma multi_compile_local_fragment _ _ENABLE_ALPHA_OUTPUT
#include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl"
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Filtering.hlsl"
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/ScreenCoordOverride.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/PostProcessing/Common.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Debug/DebuggingFullscreen.hlsl"
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/DynamicScalingClamping.hlsl"
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl"
TEXTURE2D(_InternalLut);
TEXTURE2D(_UserLut);
TEXTURE2D(_BlueNoise_Texture);
TEXTURE2D(_Grain_Texture);
float4 _Lut_Params;
float4 _UserLut_Params;
half4 _Vignette_Params1;
float4 _Vignette_Params2;
#ifdef USING_STEREO_MATRICES
float4 _Vignette_ParamsXR;
#endif
float2 _Grain_Params;
float4 _Grain_TilingParams;
float4 _Dithering_Params;
float4 _HDROutputLuminanceParams;
#define VignetteColor _Vignette_Params1.xyz
#ifdef USING_STEREO_MATRICES
#define VignetteCenterEye0 _Vignette_ParamsXR.xy
#define VignetteCenterEye1 _Vignette_ParamsXR.zw
#else
#define VignetteCenter _Vignette_Params2.xy
#endif
#define VignetteIntensity _Vignette_Params2.z
#define VignetteSmoothness _Vignette_Params2.w
#define VignetteRoundness _Vignette_Params1.w
#define LutParams _Lut_Params.xyz
#define PostExposure _Lut_Params.w
#define UserLutParams _UserLut_Params.xyz
#define UserLutContribution _UserLut_Params.w
#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 AlphaScale 1.0
#define AlphaBias 0.0
#define MinNits _HDROutputLuminanceParams.x
#define MaxNits _HDROutputLuminanceParams.y
#define PaperWhite _HDROutputLuminanceParams.z
#define OneOverPaperWhite _HDROutputLuminanceParams.w
half4 UberPost(half4 inputColor, float2 uv)
{
half3 color = inputColor.rgb;
// To save on variants we use an uniform branch for vignette. This may have performance impact on lower end platforms
UNITY_BRANCH
if (VignetteIntensity > 0)
{
#ifdef USING_STEREO_MATRICES
// With XR, the views can use asymmetric FOV which will have the center of each
// view be at a different location.
const float2 VignetteCenter = unity_StereoEyeIndex == 0 ? VignetteCenterEye0 : VignetteCenterEye1;
#endif
color = ApplyVignette(color, uv, VignetteCenter, VignetteIntensity, VignetteRoundness, VignetteSmoothness, VignetteColor);
}
// Color grading is always enabled when post-processing/uber is active
{
color = ApplyColorGrading(color, PostExposure, TEXTURE2D_ARGS(_InternalLut, sampler_LinearClamp), LutParams, TEXTURE2D_ARGS(_UserLut, sampler_LinearClamp), UserLutParams, UserLutContribution, PaperWhite, OneOverPaperWhite);
}
#if _FILM_GRAIN
{
color = ApplyGrain(color, uv, TEXTURE2D_ARGS(_Grain_Texture, sampler_LinearRepeat), GrainIntensity, GrainResponse, GrainScale, GrainOffset, OneOverPaperWhite);
}
#endif
#if _DITHERING
{
color = ApplyDithering(color, uv, TEXTURE2D_ARGS(_BlueNoise_Texture, sampler_PointRepeat), DitheringScale, DitheringOffset, PaperWhite, OneOverPaperWhite);
}
#endif
#if _ENABLE_ALPHA_OUTPUT
// Saturate is necessary to avoid issues when additive blending pushes the alpha over 1.
return half4(color, saturate(inputColor.a));
#else
return half4(color, 1);
#endif
}
ENDHLSL
SubShader
{
Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline"}
Pass
{
Name "OnTileUberPost"
LOD 100
ZTest Always ZWrite Off Cull Off
HLSLPROGRAM
#pragma vertex Vert
#pragma fragment FragUberPost
// Declares the framebuffer input as a texture 2d containing half.
FRAMEBUFFER_INPUT_X_HALF(0);
half4 FragUberPost(Varyings input) : SV_Target
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
float2 uv = input.texcoord;
// NOTE: Hlsl specifies missing input.a to fill 1 (0 for .rgb).
// InputColor is a "bottom" layer for alpha output.
half4 inputColor = LOAD_FRAMEBUFFER_X_INPUT(0, input.positionCS.xy);
return UberPost(inputColor, uv);
}
ENDHLSL
}
Pass
{
Name "OnTileUberPostMSSoftware"
LOD 100
ZTest Always ZWrite Off Cull Off
HLSLPROGRAM
#pragma vertex Vert
#pragma fragment FragUberPostMSSoftware
#pragma target 5.0
#pragma multi_compile _ _MSAA_2 _MSAA_4
#if defined(_MSAA_2)
#define MSAA_SAMPLES 2
#elif defined(_MSAA_4)
#define MSAA_SAMPLES 4
#else
#define MSAA_SAMPLES 1
#endif
// Declares the framebuffer input as a texture 2d containing half.
FRAMEBUFFER_INPUT_X_HALF_MS(0);
half4 MSAAShaderResolveInputAttachment0(float2 pos, const int msaaSamples)
{
half4 inputColor = half4(0.0, 0.0, 0.0, 0.0);
UNITY_UNROLL
for (int i = 0; i < msaaSamples; ++i) {
half4 col = LOAD_FRAMEBUFFER_INPUT_X_MS(0, i, pos);
inputColor = inputColor + col;
}
return inputColor / msaaSamples;
}
// Run run at fragment frequency and perform a software resolve of the MSAA
// color samples and then run the post-process shader the average result. Faster but not as correct
// as running it per-sample. The resultant output can either be written to a non MSAA surface as it has
// been resolved or to a MSAA surface where all the samples will end up the same which some hardware
// resolve operations will optimize due to detecting no difference in a fragment.
half4 FragUberPostMSSoftware(Varyings input) : SV_Target0
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
float2 uv = input.texcoord;
// NOTE: Hlsl specifies missing input.a to fill 1 (0 for .rgb).
// InputColor is a "bottom" layer for alpha output.
half4 inputColor = MSAAShaderResolveInputAttachment0(input.positionCS.xy, MSAA_SAMPLES);
return UberPost(inputColor, uv);
}
ENDHLSL
}
Pass
{
Name "OnTileUberPostTextureReadVersion"
LOD 100
ZTest Always ZWrite Off Cull Off
HLSLPROGRAM
#pragma vertex Vert
#pragma fragment FragUberPostTextureReadVersion
#pragma target 5.0
#pragma enable_d3d11_debug_symbols
#pragma debug
// Fallback shader to use when we can't keep things on tile, so usually in the editor when dealing with
// MSAA source targets to a non MSAA destination we can't perform a software resolve in the shader and
// so have to fall back to resolving the color target and reading it in as a texture.
// Where we have a MSAA destination we can avoid this.
half4 FragUberPostTextureReadVersion(Varyings input) : SV_Target0
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
float2 uv = SCREEN_COORD_APPLY_SCALEBIAS(UnityStereoTransformScreenSpaceTex(input.texcoord));
half4 inputColor = SAMPLE_TEXTURE2D_X(_BlitTexture, sampler_LinearClamp, uv);
return UberPost(inputColor, uv);
}
ENDHLSL
}
// Visibility Mesh Versions ------------------------------------------------------------------------------------
Pass
{
Name "OnTileUberPostVisMesh"
LOD 100
ZTest Always ZWrite Off Cull Off
HLSLPROGRAM
#include "Packages/com.unity.render-pipelines.universal/Shaders/XR/XRVisibilityMeshHelper.hlsl"
#pragma vertex VertVisibilityMeshXR
#pragma fragment FragUberPost
// Declares the framebuffer input as a texture 2d containing half.
FRAMEBUFFER_INPUT_X_HALF(0);
half4 FragUberPost(Varyings input) : SV_Target
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
float2 uv = input.texcoord;
// NOTE: Hlsl specifies missing input.a to fill 1 (0 for .rgb).
// InputColor is a "bottom" layer for alpha output.
half4 inputColor = LOAD_FRAMEBUFFER_X_INPUT(0, input.positionCS.xy);
return UberPost(inputColor, uv);
}
ENDHLSL
}
Pass
{
Name "OnTileUberPostMSSoftwareVisMesh"
LOD 100
ZTest Always ZWrite Off Cull Off
HLSLPROGRAM
#include "Packages/com.unity.render-pipelines.universal/Shaders/XR/XRVisibilityMeshHelper.hlsl"
#pragma vertex VertVisibilityMeshXR
#pragma fragment FragUberPostMSSoftware
#pragma target 5.0
#pragma multi_compile _ _MSAA_2 _MSAA_4
#if defined(_MSAA_2)
#define MSAA_SAMPLES 2
#elif defined(_MSAA_4)
#define MSAA_SAMPLES 4
#else
#define MSAA_SAMPLES 1
#endif
// Declares the framebuffer input as a texture 2d containing half.
FRAMEBUFFER_INPUT_X_HALF_MS(0);
half4 MSAAShaderResolveInputAttachment0(float2 pos, const int msaaSamples)
{
half4 inputColor = half4(0.0, 0.0, 0.0, 0.0);
UNITY_UNROLL
for (int i = 0; i < msaaSamples; ++i) {
half4 col = LOAD_FRAMEBUFFER_INPUT_X_MS(0, i, pos);
inputColor = inputColor + col;
}
return inputColor / msaaSamples;
}
// Run at fragment frequency and perform a software resolve of the MSAA
// color samples and then run the post-process shader the average result. Faster but not as correct
// as running it per-sample. The resultant output can either be written to a non MSAA surface as it has
// been resolved or to a MSAA surface where all the samples will end up the same which some hardware
// resolve operations will optimize due to detecting no difference in a fragment.
half4 FragUberPostMSSoftware(Varyings input) : SV_Target0
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
float2 uv = input.texcoord;
// NOTE: Hlsl specifies missing input.a to fill 1 (0 for .rgb).
// InputColor is a "bottom" layer for alpha output.
half4 inputColor = MSAAShaderResolveInputAttachment0(input.positionCS.xy, MSAA_SAMPLES);
return UberPost(inputColor, uv);
}
ENDHLSL
}
Pass
{
Name "OnTileUberPostTextureReadVersionVisMesh"
LOD 100
ZTest Always ZWrite Off Cull Off
HLSLPROGRAM
#include "Packages/com.unity.render-pipelines.universal/Shaders/XR/XRVisibilityMeshHelper.hlsl"
#pragma vertex VertVisibilityMeshXR
#pragma fragment FragUberPostTextureReadVersion
#pragma target 5.0
#pragma debug
// Fallback shader to use when we can't keep things on tile, so usually in the editor when dealing with
// MSAA source targets to a non MSAA destination we can't perform a software resolve in the shader and
// so have to fall back to resolving the color target and reading it in as a texture.
// Where we have a MSAA destination we can avoid this.
half4 FragUberPostTextureReadVersion(Varyings input) : SV_Target0
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
float2 uv = SCREEN_COORD_APPLY_SCALEBIAS(UnityStereoTransformScreenSpaceTex(input.texcoord));
half4 inputColor = SAMPLE_TEXTURE2D_X(_BlitTexture, sampler_LinearClamp, uv);
return UberPost(inputColor, uv);
}
ENDHLSL
}
}
}