////////////////////////////////////////////////////// // MK Glow Debug // // // // Created by Michael Kremmel // // www.michaelkremmel.de // // Copyright © 2021 All rights reserved. // ////////////////////////////////////////////////////// #ifndef MK_GLOW_DEBUG #define MK_GLOW_DEBUG #include "../Inc/Common.hlsl" #ifdef COMPUTE_SHADER UNIFORM_RWTEXTURE_2D(_TargetTex) #endif #if defined(MK_DEBUG_RAW_BLOOM) UNIFORM_SAMPLER_AND_TEXTURE_2D(_SourceTex) #ifndef COMPUTE_SHADER uniform float2 _SourceTex_TexelSize; #ifndef MK_NATURAL uniform half2 _BloomThreshold; #endif uniform half _LumaScale; #endif #elif defined(MK_DEBUG_RAW_LENS_FLARE) UNIFORM_SAMPLER_AND_TEXTURE_2D(_SourceTex) #ifndef COMPUTE_SHADER uniform float2 _SourceTex_TexelSize; uniform half2 _LensFlareThreshold; uniform half _LumaScale; #endif #elif defined(MK_DEBUG_RAW_GLARE) UNIFORM_SAMPLER_AND_TEXTURE_2D(_SourceTex) #ifndef COMPUTE_SHADER uniform float2 _SourceTex_TexelSize; uniform half2 _GlareThreshold; uniform half _LumaScale; #endif #elif defined(MK_DEBUG_LENS_FLARE) #ifndef COMPUTE_SHADER uniform float2 _ResolutionScale; uniform float _LensFlareChromaticAberration; uniform float2 _LensFlareTex_TexelSize; #endif UNIFORM_SAMPLER_AND_TEXTURE_2D(_LensFlareTex) #elif defined(MK_DEBUG_GLARE) #ifndef COMPUTE_SHADER uniform float2 _ResolutionScale; uniform float2 _Glare0Tex_TexelSize; uniform half _GlareBlend; uniform half _GlareGlobalIntensity; uniform half4 _GlareIntensity; // 0 1 2 3 uniform half4 _GlareScattering; // 0 1 2 3 uniform half4 _GlareDirection01; // 0 1 uniform half4 _GlareDirection23; // 2 3 uniform float4 _GlareOffset; // 0 1 2 3 uniform float _Blooming; #endif #ifdef MK_GLARE_1 UNIFORM_SAMPLER_AND_TEXTURE_2D(_Glare0Tex) #endif #ifdef MK_GLARE_2 UNIFORM_SAMPLER_AND_TEXTURE_2D(_Glare1Tex) #endif #ifdef MK_GLARE_3 UNIFORM_SAMPLER_AND_TEXTURE_2D(_Glare2Tex) #endif #ifdef MK_GLARE_4 UNIFORM_SAMPLER_AND_TEXTURE_2D(_Glare3Tex) #endif #elif defined(MK_DEBUG_COMPOSITE) UNIFORM_SAMPLER_AND_TEXTURE_2D(_SourceTex) UNIFORM_SAMPLER_AND_TEXTURE_2D(_BloomTex) #ifndef COMPUTE_SHADER uniform float2 _BloomTex_TexelSize; uniform half _BloomSpread; uniform half _BloomIntensity; uniform float _Blooming; #endif #ifdef MK_LENS_FLARE UNIFORM_SAMPLER_AND_TEXTURE_2D(_LensFlareTex) #ifndef COMPUTE_SHADER uniform float2 _LensFlareTex_TexelSize; uniform float _LensFlareChromaticAberration; #endif #endif #ifdef MK_LENS_SURFACE #ifndef COMPUTE_SHADER uniform half _LensSurfaceDirtIntensity; uniform half _LensSurfaceDiffractionIntensity; uniform float4 _LensSurfaceDirtTex_ST; #endif UNIFORM_SAMPLER_AND_TEXTURE_2D_NO_SCALE(_LensSurfaceDirtTex) UNIFORM_SAMPLER_AND_TEXTURE_2D_NO_SCALE(_LensSurfaceDiffractionTex) #endif #if defined(MK_LENS_FLARE) || defined(MK_GLARE) #ifndef COMPUTE_SHADER uniform float2 _ResolutionScale; #endif #endif #ifdef MK_GLARE #ifndef COMPUTE_SHADER uniform float2 _Glare0Tex_TexelSize; uniform half _GlareBlend; uniform half _GlareGlobalIntensity; uniform half4 _GlareIntensity; // 0 1 2 3 uniform half4 _GlareScattering; // 0 1 2 3 uniform half4 _GlareDirection01; // 0 1 uniform half4 _GlareDirection23; // 2 3 uniform float4 _GlareOffset; // 0 1 2 3 #endif #ifdef MK_GLARE_1 UNIFORM_SAMPLER_AND_TEXTURE_2D(_Glare0Tex) #endif #ifdef MK_GLARE_2 UNIFORM_SAMPLER_AND_TEXTURE_2D(_Glare1Tex) #endif #ifdef MK_GLARE_3 UNIFORM_SAMPLER_AND_TEXTURE_2D(_Glare2Tex) #endif #ifdef MK_GLARE_4 UNIFORM_SAMPLER_AND_TEXTURE_2D(_Glare3Tex) #endif #endif #else #ifndef COMPUTE_SHADER uniform float2 _BloomTex_TexelSize; #endif UNIFORM_SAMPLER_AND_TEXTURE_2D(_BloomTex) uniform half _BloomSpread; uniform half _BloomIntensity; uniform float _Blooming; #endif #ifndef COMPUTE_SHADER #ifdef MK_DEBUG_COMPOSITE #if defined(MK_LENS_SURFACE) && defined(MK_LENS_FLARE) #define VertGeoOutput VertGeoOutputDouble #define MK_LENS_SURFACE_DIFFRACTION_UV uv1.xy #define LENS_FLARE_SPREAD uv1.zw #elif defined(MK_LENS_SURFACE) || defined(MK_LENS_FLARE) #define VertGeoOutput VertGeoOutputPlus #define MK_LENS_SURFACE_DIFFRACTION_UV uv1.xy #define LENS_FLARE_SPREAD uv1.xy #else #define VertGeoOutput VertGeoOutputAdvanced #endif #else #if defined(MK_LENS_FLARE) || defined(MK_DEBUG_LENS_FLARE) #define LENS_FLARE_SPREAD uv0.zw #define VertGeoOutput VertGeoOutputAdvanced #else #define VertGeoOutput VertGeoOutputAdvanced #endif #endif VertGeoOutput vert (VertexInputOnlyPosition i0) { VertGeoOutput o; UNITY_SETUP_INSTANCE_ID(i0); INITIALIZE_STRUCT(VertGeoOutput, o); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); o.pos = TransformMeshPos(i0.vertex); #ifdef MK_LEGACY_BLIT o.uv0.xy = i0.texcoord0; #if UNITY_UV_STARTS_AT_TOP #if defined(MK_DEBUG_RAW_BLOOM) || defined(MK_DEBUG_RAW_LENS_FLARE) || defined(MK_DEBUG_RAW_GLARE) if (_SourceTex_TexelSize.y < 0) o.uv0.xy = 1-o.uv0.xy; #elif defined(MK_DEBUG_LENS_FLARE) if (_LensFlareTex_TexelSize.y < 0) o.uv0.xy = 1-o.uv0.xy; #elif defined(MK_DEBUG_GLARE) if (_Glare0Tex_TexelSize.y < 0) o.uv0.xy = 1-o.uv0.xy; #elif defined(MK_DEBUG_COMPOSITE) if (_BloomTex_TexelSize.y < 0) o.uv0.xy = 1-o.uv0.xy; #else //MK_DEBUG_BLOOM if (_BloomTex_TexelSize.y < 0) o.uv0.xy = 1-o.uv0.xy; #endif #endif #else o.uv0.xy = SetMeshUV(o.pos.xy); #endif #if defined(MK_DEBUG_BLOOM) || defined(MK_DEBUG_COMPOSITE) o.uv0.zw = BLOOM_TEXEL_SIZE * _BloomSpread; #endif #if defined(MK_DEBUG_COMPOSITE) && defined(MK_LENS_SURFACE) o.MK_LENS_SURFACE_DIFFRACTION_UV = LensSurfaceDiffractionUV(o.uv0.xy); #endif #if defined(MK_LENS_FLARE) && defined(MK_DEBUG_COMPOSITE) || defined(MK_DEBUG_LENS_FLARE) o.LENS_FLARE_SPREAD = LENS_FLARE_TEXEL_SIZE * _LensFlareChromaticAberration * _ResolutionScale; #endif return o; } #ifdef GEOMETRY_SHADER [maxvertexcount(3)] void geom(point VertexInputEmpty i0[1], inout TriangleStream tristream) { VertGeoOutput o; INITIALIZE_STRUCT(VertGeoOutput, o); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); UNITY_TRANSFER_VERTEX_OUTPUT_STEREO(i0[0], o); #if defined(MK_DEBUG_BLOOM) || defined(MK_DEBUG_COMPOSITE) float2 bloomSpread = BLOOM_TEXEL_SIZE * _BloomSpread; #endif #if defined(MK_LENS_FLARE) && defined(MK_DEBUG_COMPOSITE) || defined(MK_DEBUG_LENS_FLARE) float2 lensFlareSpread = LENS_FLARE_TEXEL_SIZE * _LensFlareChromaticAberration * _ResolutionScale; #endif o.pos = TransformMeshPos(SCREEN_VERTICES[0]); o.uv0.xy = SetMeshUV(o.pos.xy); #if defined(MK_DEBUG_BLOOM) || defined(MK_DEBUG_COMPOSITE) o.uv0.zw = bloomSpread; #endif #if defined(MK_DEBUG_COMPOSITE) && defined(MK_LENS_SURFACE) o.MK_LENS_SURFACE_DIFFRACTION_UV = LensSurfaceDiffractionUV(o.uv0.xy); #endif #if defined(MK_LENS_FLARE) && defined(MK_DEBUG_COMPOSITE) || defined(MK_DEBUG_LENS_FLARE) o.LENS_FLARE_SPREAD = lensFlareSpread; #endif tristream.Append(o); o.pos = TransformMeshPos(SCREEN_VERTICES[1]); o.uv0.xy = SetMeshUV(o.pos.xy); #if defined(MK_DEBUG_BLOOM) || defined(MK_DEBUG_COMPOSITE) o.uv0.zw = bloomSpread; #endif #if defined(MK_DEBUG_COMPOSITE) && defined(MK_LENS_SURFACE) o.MK_LENS_SURFACE_DIFFRACTION_UV = LensSurfaceDiffractionUV(o.uv0.xy); #endif #if defined(MK_LENS_FLARE) && defined(MK_DEBUG_COMPOSITE) || defined(MK_DEBUG_LENS_FLARE) o.LENS_FLARE_SPREAD = lensFlareSpread; #endif tristream.Append(o); o.pos = TransformMeshPos(SCREEN_VERTICES[2]); o.uv0.xy = SetMeshUV(o.pos.xy); #if defined(MK_DEBUG_BLOOM) || defined(MK_DEBUG_COMPOSITE) o.uv0.zw = bloomSpread; #endif #if defined(MK_DEBUG_COMPOSITE) && defined(MK_LENS_SURFACE) o.MK_LENS_SURFACE_DIFFRACTION_UV = LensSurfaceDiffractionUV(o.uv0.xy); #endif #if defined(MK_LENS_FLARE) && defined(MK_DEBUG_COMPOSITE) || defined(MK_DEBUG_LENS_FLARE) o.LENS_FLARE_SPREAD = lensFlareSpread; #endif tristream.Append(o); } #endif #endif #if defined(MK_DEBUG_RAW_BLOOM) || defined(MK_DEBUG_RAW_LENS_FLARE) || defined(MK_DEBUG_RAW_GLARE) #ifndef COMPUTE_SHADER #define HEADER half4 frag (VertGeoOutput o) : SV_Target #endif #endif #ifdef MK_DEBUG_RAW_BLOOM #ifdef COMPUTE_SHADER #define HEADER [numthreads(8,8,1)] void DebugRawBloom (uint2 id : SV_DispatchThreadID) #endif HEADER { UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(o); #ifndef MK_NATURAL RETURN_TARGET_TEX ConvertToColorSpace(half4(LuminanceThreshold(Presample(PASS_TEXTURE_2D(_SourceTex, sampler_linear_clamp_SourceTex), UV_0, SOURCE_TEXEL_SIZE).rgb, BLOOM_THRESHOLD, LUMA_SCALE), 1)); #else RETURN_TARGET_TEX ConvertToColorSpace(half4(NaturalRel(Presample(PASS_TEXTURE_2D(_SourceTex, sampler_linear_clamp_SourceTex), UV_0, SOURCE_TEXEL_SIZE).rgb, LUMA_SCALE), 1)); #endif } #elif defined(MK_DEBUG_RAW_LENS_FLARE) #ifdef COMPUTE_SHADER #define HEADER [numthreads(8,8,1)] void DebugRawLensFlare (uint2 id : SV_DispatchThreadID) #endif HEADER { UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(o); #ifdef MK_NATURAL RETURN_TARGET_TEX ConvertToColorSpace(half4(NaturalRel(Presample(PASS_TEXTURE_2D(_SourceTex, sampler_linear_clamp_SourceTex), UV_0, SOURCE_TEXEL_SIZE).rgb, LUMA_SCALE), 1)); #else RETURN_TARGET_TEX ConvertToColorSpace(half4(LuminanceThreshold(Presample(PASS_TEXTURE_2D(_SourceTex, sampler_linear_clamp_SourceTex), UV_0, SOURCE_TEXEL_SIZE).rgb, LENS_FLARE_THRESHOLD, LUMA_SCALE), 1)); #endif } #elif defined(MK_DEBUG_RAW_GLARE) #ifdef COMPUTE_SHADER #define HEADER [numthreads(8,8,1)] void DebugRawGlare (uint2 id : SV_DispatchThreadID) #endif HEADER { UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(o); half screenFade = ScreenFade(UV_0, 0.75, 0.0); #ifdef MK_NATURAL RETURN_TARGET_TEX ConvertToColorSpace(half4(NaturalRel(Presample(PASS_TEXTURE_2D(_SourceTex, sampler_linear_clamp_SourceTex), UV_0, SOURCE_TEXEL_SIZE).rgb, LUMA_SCALE), 1) * screenFade); #else RETURN_TARGET_TEX ConvertToColorSpace(half4(LuminanceThreshold(Presample(PASS_TEXTURE_2D(_SourceTex, sampler_linear_clamp_SourceTex), UV_0, SOURCE_TEXEL_SIZE).rgb, GLARE_THRESHOLD, LUMA_SCALE), 1) * screenFade); #endif } #elif defined(MK_DEBUG_GLARE) #ifdef COMPUTE_SHADER #define HEADER [numthreads(8,8,1)] void DebugGlare (uint2 id : SV_DispatchThreadID) #else #define HEADER half4 frag (VertGeoOutputSimple o) : SV_Target #endif HEADER { UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(o); half4 glare = 0; #ifdef MK_GLARE_1 glare = GaussianBlur1D(PASS_TEXTURE_2D(_Glare0Tex, sampler_linear_clamp_Glare0Tex), UV_0, GLARE0_TEX_TEXEL_SIZE * RESOLUTION_SCALE, GLARE0_SCATTERING, GLARE0_DIRECTION, GLARE0_OFFSET) * GLARE0_INTENSITY; #endif #ifdef MK_GLARE_2 glare += GaussianBlur1D(PASS_TEXTURE_2D(_Glare1Tex, sampler_linear_clamp_Glare1Tex), UV_0, GLARE0_TEX_TEXEL_SIZE * RESOLUTION_SCALE, GLARE1_SCATTERING, GLARE1_DIRECTION, GLARE1_OFFSET) * GLARE1_INTENSITY; #endif #ifdef MK_GLARE_3 glare += GaussianBlur1D(PASS_TEXTURE_2D(_Glare2Tex, sampler_linear_clamp_Glare2Tex), UV_0, GLARE0_TEX_TEXEL_SIZE * RESOLUTION_SCALE, GLARE2_SCATTERING, GLARE2_DIRECTION, GLARE2_OFFSET) * GLARE2_INTENSITY; #endif #ifdef MK_GLARE_4 glare += GaussianBlur1D(PASS_TEXTURE_2D(_Glare3Tex, sampler_linear_clamp_Glare3Tex), UV_0, GLARE0_TEX_TEXEL_SIZE * RESOLUTION_SCALE, GLARE3_SCATTERING, GLARE3_DIRECTION, GLARE3_OFFSET) * GLARE3_INTENSITY; #endif #ifdef MK_NATURAL glare.rgb = max(0, lerp(half3(0,0,0), glare.rgb * 0.25, GLARE_GLOBAL_INTENSITY)); #else glare *= GLARE_GLOBAL_INTENSITY; #endif glare.rgb = lerp(half3(0,0,0), glare.rgb, GLARE_BLEND); #if defined(MK_RENDER_PRIORITY_BALANCED) || defined(MK_RENDER_PRIORITY_QUALITY) glare.rgb = Blooming(glare.rgb, BLOOMING); #endif RETURN_TARGET_TEX ConvertToColorSpace(glare); } #elif defined(MK_DEBUG_LENS_FLARE) #ifdef COMPUTE_SHADER #define HEADER [numthreads(8,8,1)] void DebugLensFlare (uint2 id : SV_DispatchThreadID) #else #define HEADER half4 frag (VertGeoOutput o) : SV_Target #endif HEADER { UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(o); RETURN_TARGET_TEX ConvertToColorSpace(SampleTex2DCircularChromaticAberration(PASS_TEXTURE_2D(_LensFlareTex, sampler_linear_clamp_LensFlareTex), UV_0, LENS_FLARE_CHROMATIC_ABERRATION)); } #elif defined(MK_DEBUG_COMPOSITE) #ifdef COMPUTE_SHADER #define HEADER [numthreads(8,8,1)] void DebugComposite (uint2 id : SV_DispatchThreadID) #else #define HEADER half4 frag (VertGeoOutput o) : SV_Target #endif HEADER { #include "CompositeSample.hlsl" } #else #ifdef COMPUTE_SHADER #define HEADER [numthreads(8,8,1)] void DebugBloom (uint2 id : SV_DispatchThreadID) #else #define HEADER half4 frag (VertGeoOutput o) : SV_Target #endif HEADER { UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(o); #ifdef MK_RENDER_PRIORITY_QUALITY half4 g = UpsampleHQ(PASS_TEXTURE_2D(_BloomTex, sampler_linear_clamp_BloomTex), UV_0, BLOOM_TEXEL_SIZE * _BloomSpread); #else half4 g = SampleTex2D(PASS_TEXTURE_2D(_BloomTex, sampler_linear_clamp_BloomTex), UV_0); #endif #ifdef MK_NATURAL g.rgb = lerp(half3(0,0,0), g.rgb, BLOOM_INTENSITY); #else g.rgb *= BLOOM_INTENSITY; #endif g.rgb = Blooming(g.rgb, BLOOMING); RETURN_TARGET_TEX ConvertToColorSpace(g); } #endif #endif