Files
sbox-public/engine/Sandbox.Engine/Systems/Render/RenderPipeline/BloomLayer.cs
Lorenz Junglas 6808d8768e Shutdown fixes (#3553)
* Stop generating solutions via -test flag add -generatesolution

* Add TestAppSystem remove Application.InitUnitTest

Avoids some hacks and also makes sure our tests are as close to a real AppSystem as possible.

* Add shutdown unit test

shuts down an re-inits the engine

* Properly dispose native resources hold by managed during shutdown

Should fix a bunch of crashes

* Fix filesystem and networking tests

* StandaloneTest does proper Game Close

* Make sure package tests clean up properly

* Make sure menu scene and resources are released on shutdown

* Report leaked scenes on shutdown

* Ensure DestroyImmediate is not used on scenes

* Fix unmounting in unit tests not clearing native refs

* Force destroy native resource on ResourceLib Clear
2025-12-08 15:55:11 +01:00

77 lines
2.3 KiB
C#

using NativeEngine;
namespace Sandbox.Rendering;
internal class BloomLayer : RenderLayer
{
public BloomLayer()
{
Name = $"Bloom Layer";
LayerType = SceneLayerType.Opaque;
Flags |= LayerFlags.NeverRemove;
ShaderMode = "Forward";
ClearFlags = ClearFlags.Color;
Flags |= LayerFlags.NeedsPerViewLightingConstants;
Attributes.Set( "UseTiledRendering", false ); // We render at quarter res and with lighting and this fucks up the offsets of tiled rendering
ObjectFlagsRequired = SceneObjectFlags.EffectsBloomLayer;
ObjectFlagsExcluded = SceneObjectFlags.IsLight;
}
public void Setup( ISceneView view, RenderTarget renderTarget )
{
ColorAttachment = renderTarget.ToColorHandle( view );
DepthAttachment = renderTarget.ToDepthHandle( view );
}
}
internal class BloomDownsampleLayer : ProceduralRenderLayer
{
public RenderTarget RT { get; set; }
public BloomDownsampleLayer()
{
Name = "Bloom Layer Gaussian Blur";
Flags |= LayerFlags.NeverRemove;
}
// Bit wasteful if we are not rendering anything before, in the future these two layers would only be called if we are rendering something
internal override void OnRender()
{
// Fucked?
// Graphics.GenerateMipMaps( rt.ColorTarget, Graphics.DownsampleMethod.GaussianBlur );
NativeEngine.CSceneSystem.DownsampleTexture( Graphics.Context, RT.ColorTarget.native, (int)Graphics.DownsampleMethod.GaussianBlur );
}
}
internal class QuarterDepthDownsampleLayer : ProceduralRenderLayer
{
private Material DepthResolve;
private bool MSAAInput;
public QuarterDepthDownsampleLayer()
{
Name = "Quarter Depth Downsample";
Flags |= LayerFlags.NeverRemove | LayerFlags.DoesntModifyColorBuffers;
ClearFlags = ClearFlags.Depth | ClearFlags.Stencil;
LayerType = SceneLayerType.Opaque;
DepthResolve = Material.Create( "depthresolve", "shaders/depthresolve.shader" );
}
public void Setup( ISceneView view, RenderViewport viewport, SceneViewRenderTargetHandle rtDepth, bool msaaInput, RenderTarget rtOutDepth )
{
RenderTargetAttributes["SourceDepth"] = rtDepth;
MSAAInput = msaaInput;
ColorAttachment = rtOutDepth.ToColorHandle( view );
DepthAttachment = rtOutDepth.ToDepthHandle( view );
}
internal override void OnRender()
{
Graphics.Attributes.SetCombo( "D_MSAA", MSAAInput );
Graphics.Attributes.Set( "DownsampleFactor", 4 );
Graphics.Blit( DepthResolve );
}
}