RetroPostProcessing.cs
using Sandbox;
using Sandbox.Rendering;

[Title( "Retro Post-Processing" ), Category( "Retro Shading Model" ), Icon( "camera" )]
public sealed class RetroPostProcessing : Component
{
	private CommandList CommandList;

	[Change( nameof( CreateCommandList ) ), Property] public bool Dither { get; set; } = true;
	[Change( nameof( CreateCommandList ) ), Property] public bool Downscale { get; set; } = true;
	[Change( nameof( CreateCommandList ) ), Property] public bool ColorCorrection { get; set; } = true;
	[Change( nameof( CreateCommandList ) ), Property] public bool Crop { get; set; } = true;
	[Change( nameof( CreateCommandList ) ), Property] public bool Noise { get; set; } = true;

	protected override void OnEnabled()
	{
		CreateCommandList();
	}

	protected override void OnDisabled()
	{
		Scene.Camera?.RemoveCommandList( CommandList );
		CommandList = null;
	}

	private void CreateCommandList()
	{
		if ( Scene.IsEditor )
			return;

		if ( !Scene.Camera.EnablePostProcessing )
			return;

		Scene.Camera?.RemoveCommandList( CommandList );

		CommandList = new CommandList( "Overlay" );

		CommandList.Attributes.GrabFrameTexture( "ColorBuffer" );
		CommandList.Attributes.GrabDepthTexture();

		CommandList.Attributes.Set( "Dither", Dither );
		CommandList.Attributes.Set( "Downscale", Downscale );
		CommandList.Attributes.Set( "ColorCorrection", ColorCorrection );
		CommandList.Attributes.Set( "Crop", Crop );
		CommandList.Attributes.Set( "Noise", Noise );

		CommandList.Blit( Material.Load( "materials/rsm_postprocess.vmat" ) );
		Scene.Camera.AddCommandList( CommandList, Stage.BeforePostProcess, 2000 );
	}
}