Adding fixed render passes

Fixed render passes are the main render passes that apply every frame, for the entire time that your game is running.

Fixed render passes are primarily set up when deriving from CoreGame<TInitialWorld>.ConfigureRenderPipeline in your own game class. You can add and remove fixed render passes at runtime using the methods on Protogame.IRenderContext.

Configuring at game start

You can configure the fixed render passes used in game at game start, by calling IRenderPipeline.AddFixedRenderPass:

public class AddingFixedRenderPassExampleGame : CoreGame<RenderPipelineWorld>
{
    public AddingFixedRenderPassExampleGame(IKernel kernel) : base(kernel)
    {
    }

    protected override void ConfigureRenderPipeline(IRenderPipeline pipeline, IKernel kernel)
    {
        var factory = kernel.Get<IGraphicsFactory>();
        
        // Add a 3D render pass in which we render the main game world.
        pipeline.AddFixedRenderPass(factory.Create3DRenderPass());
        
        // Add a 2D batched render pass in which we render the UI.
        pipeline.AddFixedRenderPass(factory.Create2DBatchedRenderPass());
    }
}

Modifying at runtime

You can add and remove fixed render passes at runtime, by calling IRenderContext.AddFixedRenderPass and IRenderContext.RemoveFixedRenderPass:

public class FixedRenderPassEntity : Entity
{
    private readonly IRenderPass _renderPass;
    
    private bool _someOnceOffField;
    
    public FixedRenderPassEntity(IGraphicsFactory graphicsFactory)
    {
        _renderPass = graphicsFactory.Create3DRenderPass();
        _someOnceOffField = true;
    }

    public override void Render(IGameContext gameContext, IRenderContext renderContext)
    {
        if (renderContext.IsFirstRenderPass() && _someOnceOffField)
        {
            // You only want to call this method once, since fixed render passes are
            // permanently in the pipeline until RemoveFixedRenderPass is called.  If
            // this block of code were allowed to execute every frame, the render
            // pipeline would become infinitely long.
            renderContext.AddFixedRenderPass(_renderPass);
            _someOnceOffField = false;
        }
    }
}