2025-10-31 03:28:00 +09:00

283 lines
12 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// copy of URP10.5.0's UberPost.shader
// all change will have [NiloToon] tags
Shader "Hidden/Universal Render Pipeline/NiloToonUberPost"
{
HLSLINCLUDE
//#pragma exclude_renderers gles // [NiloToon removed]
#pragma multi_compile_local_fragment _ _DISTORTION
//#pragma multi_compile_local_fragment _ _CHROMATIC_ABERRATION // [NiloToon removed]
#pragma multi_compile_local_fragment _ _BLOOM_LQ _BLOOM_HQ _BLOOM_LQ_DIRT _BLOOM_HQ_DIRT
#pragma multi_compile_local_fragment _ _HDR_GRADING _TONEMAP_ACES _TONEMAP_NEUTRAL _TONEMAP_GRANTURISMO _TONEMAP_ACES_CUSTOM _TONEMAP_KHRONOS_PBR_NEUTRAL _TONEMAP_NILO_NPR_NEUTRAL_V1 _TONEMAP_NILO_HYBIRD_ACES// [NiloToon added: _TONEMAP_GRANTURISMO, _TONEMAP_ACES_CUSTOM, _TONEMAP_KHRONOS_PBR_NEUTRAL, _TONEMAP_NILO_NPR_NEUTRAL_V1, _TONEMAP_NILO_HYBIRD_ACES]
//#pragma multi_compile_local_fragment _ _FILM_GRAIN // [NiloToon removed]
//#pragma multi_compile_local_fragment _ _DITHERING // [NiloToon removed]
#pragma multi_compile_local_fragment _ _LINEAR_TO_SRGB_CONVERSION
#pragma multi_compile _ _USE_DRAW_PROCEDURAL
#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.universal/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/PostProcessing/Common.hlsl"
// [NiloToon added]
//==========================================================
#include "../../../ShaderLibrary/NiloUtilityHLSL/NiloScaledScreenParamUtil.hlsl"
#include "../../../ShaderLibrary/NiloUtilityHLSL/NiloPrepassBufferTextureUtil.hlsl"
#include "../../../ShaderLibrary/NiloUtilityHLSL/GranTurismoTonemap/NiloGranTurismoTonemap.hlsl"
#include "../../../ShaderLibrary/NiloUtilityHLSL/NiloCustomACES.hlsl"
#include "../../../ShaderLibrary/NiloUtilityHLSL/KhronosPBRNeutralTonemapper/NiloKhronosPBRNeutralTonemap.hlsl"
#if UNITY_VERSION < 202220
#define _BlitTexture _SourceTex
#define _BlitTexture_TexelSize _SourceTex_TexelSize
TEXTURE2D_X(_SourceTex);
#endif
#define NILOTOON_TONEMAPPING _TONEMAP_ACES || _TONEMAP_NEUTRAL || _TONEMAP_GRANTURISMO || _TONEMAP_ACES_CUSTOM || _TONEMAP_KHRONOS_PBR_NEUTRAL || _TONEMAP_NILO_NPR_NEUTRAL_V1 || _TONEMAP_NILO_HYBIRD_ACES
//==========================================================
// Hardcoded dependencies to reduce the number of variants
#if _BLOOM_LQ || _BLOOM_HQ || _BLOOM_LQ_DIRT || _BLOOM_HQ_DIRT
#define BLOOM
#if _BLOOM_LQ_DIRT || _BLOOM_HQ_DIRT
#define BLOOM_DIRT
#endif
#endif
TEXTURE2D_X(_Bloom_Texture);
TEXTURE2D(_LensDirt_Texture);
TEXTURE2D(_Grain_Texture);
TEXTURE2D(_InternalLut);
TEXTURE2D(_UserLut);
TEXTURE2D(_BlueNoise_Texture);
float4 _Lut_Params;
float4 _UserLut_Params;
float4 _Bloom_Params;
float _Bloom_RGBM;
float4 _LensDirt_Params;
float _LensDirt_Intensity;
float4 _Distortion_Params1;
float4 _Distortion_Params2;
float _Chroma_Params;
half4 _Vignette_Params1;
float4 _Vignette_Params2;
float2 _Grain_Params;
float4 _Grain_TilingParams;
float4 _Bloom_Texture_TexelSize;
float4 _Dithering_Params;
// [NiloToon added]
//==========================================================
// _NiloToonPrepassBufferTex is now defined in NiloPrepassBufferTextureUtil.hlsl
half _NiloToonBloomCharacterAreaIntensity;
half _NiloToonTonemappingCharacterAreaRemove;
half _NiloToonTonemappingCharacterAreaPreTonemapBrightnessMul;
half _NiloToonTonemappingNonCharacterAreaRemove;
half _NiloToonTonemappingNonCharacterAreaPreTonemapBrightnessMul;
half _NiloToon_CustomACESParamA;
half _NiloToon_CustomACESParamB;
half _NiloToon_CustomACESParamC;
half _NiloToon_CustomACESParamD;
half _NiloToon_CustomACESParamE;
//==========================================================
#define DistCenter _Distortion_Params1.xy
#define DistAxis _Distortion_Params1.zw
#define DistTheta _Distortion_Params2.x
#define DistSigma _Distortion_Params2.y
#define DistScale _Distortion_Params2.z
#define DistIntensity _Distortion_Params2.w
#define ChromaAmount _Chroma_Params.x
#define BloomIntensity _Bloom_Params.x
#define BloomTint _Bloom_Params.yzw
#define BloomRGBM _Bloom_RGBM.x
#define LensDirtScale _LensDirt_Params.xy
#define LensDirtOffset _LensDirt_Params.zw
#define LensDirtIntensity _LensDirt_Intensity.x
#define VignetteColor _Vignette_Params1.xyz
#define VignetteCenter _Vignette_Params2.xy
#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
float2 DistortUV(float2 uv)
{
// Note: this variant should never be set with XR
#if _DISTORTION
{
uv = (uv - 0.5) * DistScale + 0.5;
float2 ruv = DistAxis * (uv - 0.5 - DistCenter);
float ru = length(float2(ruv));
UNITY_BRANCH
if (DistIntensity > 0.0)
{
float wu = ru * DistTheta;
ru = tan(wu) * (rcp(ru * DistSigma));
uv = uv + ruv * (ru - 1.0);
}
else
{
ru = rcp(ru) * DistTheta * atan(ru * DistSigma);
uv = uv + ruv * (ru - 1.0);
}
}
#endif
return uv;
}
// [NiloToon added]
//==========================================================
half3 NiloApplyTonemap(half3 input, half characterArea)
{
#if _TONEMAP_ACES
float3 aces = unity_to_ACES(input);
input = AcesTonemap(aces);
#elif _TONEMAP_NEUTRAL
input = NeutralTonemap(input);
#elif _TONEMAP_GRANTURISMO
input = GranTurismoTonemap(input);
#elif _TONEMAP_ACES_CUSTOM
input = AcesCustomTonemap(input, _NiloToon_CustomACESParamA, _NiloToon_CustomACESParamB, _NiloToon_CustomACESParamC, _NiloToon_CustomACESParamD, _NiloToon_CustomACESParamE);
#elif _TONEMAP_KHRONOS_PBR_NEUTRAL
input = KhronosPBRNeutralToneMapping(input);
#elif _TONEMAP_NILO_NPR_NEUTRAL_V1
input = NiloNPRNeutralToneMappingV1(input);
#elif _TONEMAP_NILO_HYBIRD_ACES
float3 aces = unity_to_ACES(input);
float3 acesColor = AcesTonemap(aces);
float3 charColor = NiloHybirdTonemap(input, acesColor);
input = lerp(acesColor,charColor,characterArea);
#endif
return (input);
}
//==========================================================
half4 Frag(Varyings input) : SV_Target
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
// SHADER_LIBRARY_VERSION_MAJOR is deprecated for Unity2022.2 or later, so we will use UNITY_VERSION instead
// https://github.com/Cyanilux/URP_ShaderCodeTemplates/blob/main/URP_SimpleLitTemplate.shader#L145
#if UNITY_VERSION >= 202220 // (for URP 14 or above)
float2 uv = UnityStereoTransformScreenSpaceTex(input.texcoord); // URP14 changed the naming from uv to texcoord, see URP14's Runtime\Utilities\Blit.hlsl
#else // (for below URP 14)
float2 uv = UnityStereoTransformScreenSpaceTex(input.uv);
#endif
float2 uvDistorted = DistortUV(uv);
half4 color = 0.0;
// [NiloToon delete]
//==================================
//... (removed all unrelated logic)
//==================================
color = SAMPLE_TEXTURE2D_X(_BlitTexture, sampler_LinearClamp, uvDistorted);
float characterArea = SAMPLE_TEXTURE2D_X(_NiloToonPrepassBufferTex, sampler_LinearClamp, uv).g;
#if defined(BLOOM)
{
#if _BLOOM_HQ && !defined(SHADER_API_GLES)
half4 bloom = SampleTexture2DBicubic(TEXTURE2D_X_ARGS(_Bloom_Texture, sampler_LinearClamp), uvDistorted, _Bloom_Texture_TexelSize.zwxy, (1.0).xx, unity_StereoEyeIndex);
#else
half4 bloom = SAMPLE_TEXTURE2D_X(_Bloom_Texture, sampler_LinearClamp, uvDistorted);
#endif
#if UNITY_COLORSPACE_GAMMA
bloom.xyz *= bloom.xyz; // γ to linear
#endif
UNITY_BRANCH
if (BloomRGBM > 0)
{
bloom.xyz = DecodeRGBM(bloom);
}
//[NiloToon edited]
//==========================================================
// (original is just -> bloom.xyz *= BloomIntensity;)
bloom.xyz *= lerp(BloomIntensity,_NiloToonBloomCharacterAreaIntensity,characterArea);
//==========================================================
color.rgb += bloom.xyz * BloomTint;
#if defined(BLOOM_DIRT)
{
// UVs for the dirt texture should be DistortUV(uv * DirtScale + DirtOffset) but
// considering we use a cover-style scale on the dirt texture the difference
// isn't massive so we chose to save a few ALUs here instead in case lens
// distortion is active.
half3 dirt = SAMPLE_TEXTURE2D(_LensDirt_Texture, sampler_LinearClamp, uvDistorted * LensDirtScale + LensDirtOffset).xyz;
dirt *= LensDirtIntensity;
color.rgb += dirt * bloom.xyz;
}
#endif
}
#endif
//[NiloToon added]
//==========================================================
// pre-tonemap brightness mul
color.rgb *= lerp(_NiloToonTonemappingNonCharacterAreaPreTonemapBrightnessMul, _NiloToonTonemappingCharacterAreaPreTonemapBrightnessMul, characterArea);
// tonemap
#if NILOTOON_TONEMAPPING
{
// LDR only grading, but removed character area tonemapping(0~100%)
// (HDR grading of URP is not supported)
half3 tonemappedColor = NiloApplyTonemap(color.rgb, characterArea);
half3 characterAreaResultColor = lerp(tonemappedColor, color.rgb, _NiloToonTonemappingCharacterAreaRemove);
half3 nonCharacterAreaResultColor = lerp(tonemappedColor, color.rgb, _NiloToonTonemappingNonCharacterAreaRemove);
color.rgb = lerp(nonCharacterAreaResultColor, characterAreaResultColor, characterArea);
}
#endif
//==========================================================
return color; // return with alpha
}
ENDHLSL
SubShader
{
Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline"}
LOD 100
ZTest Always ZWrite Off Cull Off
Pass
{
Name "UberPost"
HLSLPROGRAM
#pragma vertex Vert // FullscreenVert
#pragma fragment Frag
ENDHLSL
}
}
}