From bdcaeb46776b30cb441890c4db9e82af6730860f Mon Sep 17 00:00:00 2001 From: Eric Banker Date: Sun, 13 Aug 2023 08:30:00 -0500 Subject: [PATCH 1/5] Performance Enhancements: move PreviousBLuma from last to first pass to make last pass backbuffer target; Skip unnecessary Combine pass if not using Focus Bloom; --- Shaders/PD80_02_Bloom.fx | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/Shaders/PD80_02_Bloom.fx b/Shaders/PD80_02_Bloom.fx index d93511f..beacc83 100644 --- a/Shaders/PD80_02_Bloom.fx +++ b/Shaders/PD80_02_Bloom.fx @@ -577,18 +577,14 @@ namespace pd80_hqbloom color /= SigmaSum; return color; } - #endif float4 PS_Combine(float4 pos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target { float4 widebloom = tex2D( samplerBloom, texcoord ); - #if( BLOOM_USE_FOCUS_BLOOM ) float4 narrbloom = tex2D( samplerBloomF, texcoord ); return saturate( widebloom * ( 1.0 - fBloomStrength ) + narrbloom * fBloomStrength ); - #else - return widebloom; - #endif } + #endif #if( BLOOM_ENABLE_CA ) float4 PS_CA(float4 pos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target @@ -709,7 +705,7 @@ namespace pd80_hqbloom } //// TECHNIQUES ///////////////////////////////////////////////////////////////// - technique prod80_02_Bloom + technique prod80_02_Bloom_New < ui_tooltip = "Bloom\n\n" "Bloom is an effect that causes diffraction of light around bright reflective or emittive sources\n\n" "Preprocessor Settings\n\n" @@ -722,6 +718,12 @@ namespace pd80_hqbloom "rectangular (eg. 0.0001 (default) is good to about width 100, after that start to decrease this value)\n\n" "BLOOM_USE_FOCUS_BLOOM: Enables another pass to add a narrow bloom on top of the wide bloom";> { + pass PreviousBLuma + { + VertexShader = PostProcessVS; + PixelShader = PS_PrevAvgBLuma; + RenderTarget = texBPrevAvgLuma; + } pass BLuma { VertexShader = PostProcessVS; @@ -762,35 +764,41 @@ namespace pd80_hqbloom PixelShader = PS_GaussianH; RenderTarget = texBloomH; } + pass GaussianV + { + VertexShader = PostProcessVS; + PixelShader = PS_GaussianV; + RenderTarget = texBloomAll; + } #endif + #if( BLOOM_USE_FOCUS_BLOOM ) pass GaussianV { VertexShader = PostProcessVS; PixelShader = PS_GaussianV; RenderTarget = texBloom; } - #if( BLOOM_USE_FOCUS_BLOOM ) pass GaussianVF { VertexShader = PostProcessVS; PixelShader = PS_GaussianVF; RenderTarget = texBloomF; } - #endif pass Combine { VertexShader = PostProcessVS; PixelShader = PS_Combine; RenderTarget = texBloomAll; } - #if( BLOOM_ENABLE_CA == 0 ) + #endif + #if( BLOOM_ENABLE_CA == 0 ) pass GaussianBlur { VertexShader = PostProcessVS; PixelShader = PS_Gaussian; } - #endif - #if( BLOOM_ENABLE_CA == 1 ) + #endif + #if( BLOOM_ENABLE_CA == 1 ) pass AddCA { VertexShader = PostProcessVS; @@ -802,12 +810,6 @@ namespace pd80_hqbloom VertexShader = PostProcessVS; PixelShader = PS_Gaussian; } - #endif - pass PreviousBLuma - { - VertexShader = PostProcessVS; - PixelShader = PS_PrevAvgBLuma; - RenderTarget = texBPrevAvgLuma; - } + #endif } } \ No newline at end of file From 21eae82c11331e066feb7e3c47ad0d2030f41403 Mon Sep 17 00:00:00 2001 From: Eric Banker Date: Sun, 13 Aug 2023 09:31:43 -0500 Subject: [PATCH 2/5] Remove unnecessary texture without focus bloom; Rearrange function to match pass order; --- Shaders/PD80_02_Bloom.fx | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/Shaders/PD80_02_Bloom.fx b/Shaders/PD80_02_Bloom.fx index beacc83..d223087 100644 --- a/Shaders/PD80_02_Bloom.fx +++ b/Shaders/PD80_02_Bloom.fx @@ -220,9 +220,9 @@ namespace pd80_hqbloom #if( BLOOM_QUALITY_0_TO_2 == 0 ) texture texBloomIn { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; Format = RGBA16F; }; texture texBloomH { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; Format = RGBA16F; }; - texture texBloom { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; Format = RGBA16F; }; texture texBloomAll { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; Format = RGBA16F; }; #if( BLOOM_USE_FOCUS_BLOOM ) + texture texBloom { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; Format = RGBA16F; }; texture texBloomHF { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; Format = RGBA16F; }; texture texBloomF { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; Format = RGBA16F; }; #endif @@ -233,9 +233,9 @@ namespace pd80_hqbloom #define SHEIGHT ( BUFFER_HEIGHT / 2 ) texture texBloomIn { Width = SWIDTH; Height = SHEIGHT; Format = RGBA16F; }; texture texBloomH { Width = SWIDTH; Height = SHEIGHT; Format = RGBA16F; }; - texture texBloom { Width = SWIDTH; Height = SHEIGHT; Format = RGBA16F; }; texture texBloomAll { Width = SWIDTH; Height = SHEIGHT; Format = RGBA16F; }; #if( BLOOM_USE_FOCUS_BLOOM ) + texture texBloom { Width = SWIDTH; Height = SHEIGHT; Format = RGBA16F; }; texture texBloomF { Width = SWIDTH; Height = SHEIGHT; Format = RGBA16F; }; texture texBloomHF { Width = SWIDTH; Height = SHEIGHT; Format = RGBA16F; }; #endif @@ -244,9 +244,9 @@ namespace pd80_hqbloom #define SHEIGHT ( BUFFER_HEIGHT / 4 ) texture texBloomIn { Width = SWIDTH; Height = SHEIGHT; Format = RGBA16F; }; texture texBloomH { Width = SWIDTH; Height = SHEIGHT; Format = RGBA16F; }; - texture texBloom { Width = SWIDTH; Height = SHEIGHT; Format = RGBA16F; }; texture texBloomAll { Width = SWIDTH; Height = SHEIGHT; Format = RGBA16F; }; #if( BLOOM_USE_FOCUS_BLOOM ) + texture texBloom { Width = SWIDTH; Height = SHEIGHT; Format = RGBA16F; }; texture texBloomF { Width = SWIDTH; Height = SHEIGHT; Format = RGBA16F; }; texture texBloomHF { Width = SWIDTH; Height = SHEIGHT; Format = RGBA16F; }; #endif @@ -281,11 +281,11 @@ namespace pd80_hqbloom AddressW = BORDER; }; sampler samplerBloomF { Texture = texBloomF; }; + sampler samplerBloom { Texture = texBloom; }; #endif #if( BLOOM_ENABLE_CA == 1 ) sampler samplerCABloom { Texture = texCABloom; }; #endif - sampler samplerBloom { Texture = texBloom; }; sampler samplerBloomAll { Texture = texBloomAll; }; //// DEFINES //////////////////////////////////////////////////////////////////// uniform float frametime < source = "frametime"; >; @@ -326,6 +326,12 @@ namespace pd80_hqbloom // Not supported in ReShade (?) //// PIXEL SHADERS ////////////////////////////////////////////////////////////// + float PS_PrevAvgBLuma(float4 pos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target + { + float avgLuma = tex2D( samplerBAvgLuma, float2( 0.5f, 0.5f )).x; + return avgLuma; + } + float PS_WriteBLuma(float4 pos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target { float4 color = tex2D( samplerLinColor, texcoord ); @@ -698,12 +704,6 @@ namespace pd80_hqbloom return float4( color.xyz, 1.0f ); } - float PS_PrevAvgBLuma(float4 pos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target - { - float avgLuma = tex2D( samplerBAvgLuma, float2( 0.5f, 0.5f )).x; - return avgLuma; - } - //// TECHNIQUES ///////////////////////////////////////////////////////////////// technique prod80_02_Bloom_New < ui_tooltip = "Bloom\n\n" @@ -791,13 +791,6 @@ namespace pd80_hqbloom RenderTarget = texBloomAll; } #endif - #if( BLOOM_ENABLE_CA == 0 ) - pass GaussianBlur - { - VertexShader = PostProcessVS; - PixelShader = PS_Gaussian; - } - #endif #if( BLOOM_ENABLE_CA == 1 ) pass AddCA { @@ -805,11 +798,11 @@ namespace pd80_hqbloom PixelShader = PS_CA; RenderTarget = texCABloom; } + #endif pass GaussianBlur { VertexShader = PostProcessVS; PixelShader = PS_Gaussian; } - #endif } } \ No newline at end of file From c59f4c7b9a5fc5207d1d1d074e53f745fc7f7457 Mon Sep 17 00:00:00 2001 From: Eric Banker Date: Sun, 13 Aug 2023 09:46:08 -0500 Subject: [PATCH 3/5] attempt to reduce texture writing using framecount even vs odd flip-flopping --- Shaders/PD80_02_Bloom.fx | 66 ++++++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 23 deletions(-) diff --git a/Shaders/PD80_02_Bloom.fx b/Shaders/PD80_02_Bloom.fx index d223087..ba591bc 100644 --- a/Shaders/PD80_02_Bloom.fx +++ b/Shaders/PD80_02_Bloom.fx @@ -212,8 +212,8 @@ namespace pd80_hqbloom //// TEXTURES /////////////////////////////////////////////////////////////////// texture texPrepLOD { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; MipLevels = 5; }; texture texBLuma { Width = 256; Height = 256; Format = R16F; MipLevels = 9; }; - texture texBAvgLuma { Format = R16F; }; - texture texBPrevAvgLuma { Format = R16F; }; + texture texBAvgLumaEven { Format = R16F; }; + texture texBAvgLumaOdd { Format = R16F; }; #if( BLOOM_ENABLE_CA == 1 ) texture texCABloom { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; Format = RGBA16F; }; #endif @@ -256,8 +256,8 @@ namespace pd80_hqbloom sampler samplerLODColor { Texture = texPrepLOD; }; sampler samplerLinColor { Texture = ReShade::BackBufferTex; SRGBTexture = true; }; sampler samplerBLuma { Texture = texBLuma; }; - sampler samplerBAvgLuma { Texture = texBAvgLuma; }; - sampler samplerBPrevAvgLuma { Texture = texBPrevAvgLuma; }; + sampler samplerBAvgLumaEven { Texture = texBAvgLumaEven; }; + sampler samplerBAvgLumaOdd { Texture = texBAvgLumaOdd; }; sampler samplerBloomIn { Texture = texBloomIn; @@ -289,6 +289,7 @@ namespace pd80_hqbloom sampler samplerBloomAll { Texture = texBloomAll; }; //// DEFINES //////////////////////////////////////////////////////////////////// uniform float frametime < source = "frametime"; >; + uniform float framecount < source = "framecount"; >; #define LumCoeff float3(0.212656, 0.715158, 0.072186) #define PI 3.141592f #define LOOPCOUNT 500.0f @@ -326,12 +327,6 @@ namespace pd80_hqbloom // Not supported in ReShade (?) //// PIXEL SHADERS ////////////////////////////////////////////////////////////// - float PS_PrevAvgBLuma(float4 pos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target - { - float avgLuma = tex2D( samplerBAvgLuma, float2( 0.5f, 0.5f )).x; - return avgLuma; - } - float PS_WriteBLuma(float4 pos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target { float4 color = tex2D( samplerLinColor, texcoord ); @@ -340,11 +335,32 @@ namespace pd80_hqbloom return log2( luma ); } - float PS_AvgBLuma(float4 pos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target + void VS_AvgBLumaEven(in uint id : SV_VERTEXID, out float4 pos : SV_POSITION, out float2 texcoord : TEXCOORD) { + id *= 1 - framecount % 2; + PostProcessVS(id, pos, texcoord); + } + + void VS_AvgBLumaOdd(in uint id : SV_VERTEXID, out float4 pos : SV_POSITION, out float2 texcoord : TEXCOORD) { + id *= framecount % 2; + PostProcessVS(id, pos, texcoord); + } + + float PS_AvgBLumaEven(float4 pos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target { float luma = tex2Dlod( samplerBLuma, float4(0.5f, 0.5f, 0, 8 )).x; luma = exp2( luma ); - float prevluma = tex2D( samplerBPrevAvgLuma, float2( 0.5f, 0.5f )).x; + float prevluma = tex2D( samplerBAvgLumaOdd, float2( 0.5f, 0.5f )).x; + float fps = max( 1000.0f / frametime, 0.001f ); + fps *= 0.5f; //approx. 1 second delay to change luma between bright and dark + float avgLuma = lerp( prevluma, luma, saturate( 1.0f / fps )); + return avgLuma; + } + + float PS_AvgBLumaOdd(float4 pos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target + { + float luma = tex2Dlod( samplerBLuma, float4(0.5f, 0.5f, 0, 8 )).x; + luma = exp2( luma ); + float prevluma = tex2D( samplerBAvgLumaEven, float2( 0.5f, 0.5f )).x; float fps = max( 1000.0f / frametime, 0.001f ); fps *= 0.5f; //approx. 1 second delay to change luma between bright and dark float avgLuma = lerp( prevluma, luma, saturate( 1.0f / fps )); @@ -359,7 +375,11 @@ namespace pd80_hqbloom float4 PS_BloomIn(float4 pos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target { float4 color = tex2Dlod( samplerLODColor, float4( texcoord.xy, 0, BLOOM_MIPLVL )); - float luma = tex2D( samplerBAvgLuma, float2( 0.5f, 0.5f )).x; + float luma; + if (framecount % 2 == 1) + luma = tex2D( samplerBAvgLumaOdd, float2( 0.5f, 0.5f )).x; + else + luma = tex2D( samplerBAvgLumaEven, float2( 0.5f, 0.5f )).x; luma = clamp( luma, 0.000001f, 0.999999f ); color.xyz = saturate( color.xyz - luma ) / saturate( 1.0f - luma ); color.xyz = CalcExposedColor( color.xyz, luma, bExposure, GreyValue ); @@ -718,23 +738,23 @@ namespace pd80_hqbloom "rectangular (eg. 0.0001 (default) is good to about width 100, after that start to decrease this value)\n\n" "BLOOM_USE_FOCUS_BLOOM: Enables another pass to add a narrow bloom on top of the wide bloom";> { - pass PreviousBLuma - { - VertexShader = PostProcessVS; - PixelShader = PS_PrevAvgBLuma; - RenderTarget = texBPrevAvgLuma; - } pass BLuma { VertexShader = PostProcessVS; PixelShader = PS_WriteBLuma; RenderTarget = texBLuma; } - pass AvgBLuma + pass AvgBLumaEven { - VertexShader = PostProcessVS; - PixelShader = PS_AvgBLuma; - RenderTarget = texBAvgLuma; + VertexShader = VS_AvgBLumaEven; + PixelShader = PS_AvgBLumaEven; + RenderTarget = texBAvgLumaEven; + } + pass AvgBLumaOdd + { + VertexShader = VS_AvgBLumaOdd; + PixelShader = PS_AvgBLumaOdd; + RenderTarget = texBAvgLumaOdd; } pass PrepLod { From 271067d1c25b38a1e85f46553ed408edd7f7895d Mon Sep 17 00:00:00 2001 From: Eric Banker Date: Sun, 13 Aug 2023 09:55:12 -0500 Subject: [PATCH 4/5] Revert "attempt to reduce texture writing using framecount even vs odd flip-flopping" This reverts commit c59f4c7b9a5fc5207d1d1d074e53f745fc7f7457. --- Shaders/PD80_02_Bloom.fx | 66 ++++++++++++++-------------------------- 1 file changed, 23 insertions(+), 43 deletions(-) diff --git a/Shaders/PD80_02_Bloom.fx b/Shaders/PD80_02_Bloom.fx index ba591bc..d223087 100644 --- a/Shaders/PD80_02_Bloom.fx +++ b/Shaders/PD80_02_Bloom.fx @@ -212,8 +212,8 @@ namespace pd80_hqbloom //// TEXTURES /////////////////////////////////////////////////////////////////// texture texPrepLOD { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; MipLevels = 5; }; texture texBLuma { Width = 256; Height = 256; Format = R16F; MipLevels = 9; }; - texture texBAvgLumaEven { Format = R16F; }; - texture texBAvgLumaOdd { Format = R16F; }; + texture texBAvgLuma { Format = R16F; }; + texture texBPrevAvgLuma { Format = R16F; }; #if( BLOOM_ENABLE_CA == 1 ) texture texCABloom { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; Format = RGBA16F; }; #endif @@ -256,8 +256,8 @@ namespace pd80_hqbloom sampler samplerLODColor { Texture = texPrepLOD; }; sampler samplerLinColor { Texture = ReShade::BackBufferTex; SRGBTexture = true; }; sampler samplerBLuma { Texture = texBLuma; }; - sampler samplerBAvgLumaEven { Texture = texBAvgLumaEven; }; - sampler samplerBAvgLumaOdd { Texture = texBAvgLumaOdd; }; + sampler samplerBAvgLuma { Texture = texBAvgLuma; }; + sampler samplerBPrevAvgLuma { Texture = texBPrevAvgLuma; }; sampler samplerBloomIn { Texture = texBloomIn; @@ -289,7 +289,6 @@ namespace pd80_hqbloom sampler samplerBloomAll { Texture = texBloomAll; }; //// DEFINES //////////////////////////////////////////////////////////////////// uniform float frametime < source = "frametime"; >; - uniform float framecount < source = "framecount"; >; #define LumCoeff float3(0.212656, 0.715158, 0.072186) #define PI 3.141592f #define LOOPCOUNT 500.0f @@ -327,6 +326,12 @@ namespace pd80_hqbloom // Not supported in ReShade (?) //// PIXEL SHADERS ////////////////////////////////////////////////////////////// + float PS_PrevAvgBLuma(float4 pos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target + { + float avgLuma = tex2D( samplerBAvgLuma, float2( 0.5f, 0.5f )).x; + return avgLuma; + } + float PS_WriteBLuma(float4 pos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target { float4 color = tex2D( samplerLinColor, texcoord ); @@ -335,32 +340,11 @@ namespace pd80_hqbloom return log2( luma ); } - void VS_AvgBLumaEven(in uint id : SV_VERTEXID, out float4 pos : SV_POSITION, out float2 texcoord : TEXCOORD) { - id *= 1 - framecount % 2; - PostProcessVS(id, pos, texcoord); - } - - void VS_AvgBLumaOdd(in uint id : SV_VERTEXID, out float4 pos : SV_POSITION, out float2 texcoord : TEXCOORD) { - id *= framecount % 2; - PostProcessVS(id, pos, texcoord); - } - - float PS_AvgBLumaEven(float4 pos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target + float PS_AvgBLuma(float4 pos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target { float luma = tex2Dlod( samplerBLuma, float4(0.5f, 0.5f, 0, 8 )).x; luma = exp2( luma ); - float prevluma = tex2D( samplerBAvgLumaOdd, float2( 0.5f, 0.5f )).x; - float fps = max( 1000.0f / frametime, 0.001f ); - fps *= 0.5f; //approx. 1 second delay to change luma between bright and dark - float avgLuma = lerp( prevluma, luma, saturate( 1.0f / fps )); - return avgLuma; - } - - float PS_AvgBLumaOdd(float4 pos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target - { - float luma = tex2Dlod( samplerBLuma, float4(0.5f, 0.5f, 0, 8 )).x; - luma = exp2( luma ); - float prevluma = tex2D( samplerBAvgLumaEven, float2( 0.5f, 0.5f )).x; + float prevluma = tex2D( samplerBPrevAvgLuma, float2( 0.5f, 0.5f )).x; float fps = max( 1000.0f / frametime, 0.001f ); fps *= 0.5f; //approx. 1 second delay to change luma between bright and dark float avgLuma = lerp( prevluma, luma, saturate( 1.0f / fps )); @@ -375,11 +359,7 @@ namespace pd80_hqbloom float4 PS_BloomIn(float4 pos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target { float4 color = tex2Dlod( samplerLODColor, float4( texcoord.xy, 0, BLOOM_MIPLVL )); - float luma; - if (framecount % 2 == 1) - luma = tex2D( samplerBAvgLumaOdd, float2( 0.5f, 0.5f )).x; - else - luma = tex2D( samplerBAvgLumaEven, float2( 0.5f, 0.5f )).x; + float luma = tex2D( samplerBAvgLuma, float2( 0.5f, 0.5f )).x; luma = clamp( luma, 0.000001f, 0.999999f ); color.xyz = saturate( color.xyz - luma ) / saturate( 1.0f - luma ); color.xyz = CalcExposedColor( color.xyz, luma, bExposure, GreyValue ); @@ -738,23 +718,23 @@ namespace pd80_hqbloom "rectangular (eg. 0.0001 (default) is good to about width 100, after that start to decrease this value)\n\n" "BLOOM_USE_FOCUS_BLOOM: Enables another pass to add a narrow bloom on top of the wide bloom";> { + pass PreviousBLuma + { + VertexShader = PostProcessVS; + PixelShader = PS_PrevAvgBLuma; + RenderTarget = texBPrevAvgLuma; + } pass BLuma { VertexShader = PostProcessVS; PixelShader = PS_WriteBLuma; RenderTarget = texBLuma; } - pass AvgBLumaEven + pass AvgBLuma { - VertexShader = VS_AvgBLumaEven; - PixelShader = PS_AvgBLumaEven; - RenderTarget = texBAvgLumaEven; - } - pass AvgBLumaOdd - { - VertexShader = VS_AvgBLumaOdd; - PixelShader = PS_AvgBLumaOdd; - RenderTarget = texBAvgLumaOdd; + VertexShader = PostProcessVS; + PixelShader = PS_AvgBLuma; + RenderTarget = texBAvgLuma; } pass PrepLod { From 1b6388cc9dbd6fe3dbdd64050446a0bed54f59e2 Mon Sep 17 00:00:00 2001 From: Eric Banker Date: Sun, 13 Aug 2023 09:59:55 -0500 Subject: [PATCH 5/5] revert technique rename for comparison testing --- Shaders/PD80_02_Bloom.fx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shaders/PD80_02_Bloom.fx b/Shaders/PD80_02_Bloom.fx index d223087..9075728 100644 --- a/Shaders/PD80_02_Bloom.fx +++ b/Shaders/PD80_02_Bloom.fx @@ -705,7 +705,7 @@ namespace pd80_hqbloom } //// TECHNIQUES ///////////////////////////////////////////////////////////////// - technique prod80_02_Bloom_New + technique prod80_02_Bloom < ui_tooltip = "Bloom\n\n" "Bloom is an effect that causes diffraction of light around bright reflective or emittive sources\n\n" "Preprocessor Settings\n\n"