Skip to content

Configure BIRP for Tick UI

Configure the Built-in render pipeline integration so Tick UI attaches to the camera correctly. This page covers the BIRP-specific configuration beyond the basic Inspector setup shown in Set up Tick UI.

This page assumes you have already installed Tick UI and completed the basic setup.

To configure BIRP for Tick UI

  1. Confirm the project is on Built-in. TICK_URP should not be defined. Check Project Settings > Player > Other Settings > Scripting Define Symbols for the active platform.
  2. Attach TickBIRPInjector to the camera GameObject and put your BaseGameUI subclass on the same GameObject. The component requires a Camera ([RequireComponent(typeof(Camera))]) and finds the recorder via GetComponent<TickRecorder>() on the same GameObject. If you have multiple cameras, attach the pair to the camera responsible for the HUD.
  3. Choose the Camera Event that matches your usage. The default AfterEverything puts Tick UI on top of all camera output. Earlier events change where the UI sits in the per-camera command-buffer order.

Choose the Camera Event

CameraEvent controls where the Tick UI command buffer runs in the per-camera frame. Common choices:

Event Effect
AfterEverything (default) UI draws on top of the final camera output. Best for HUDs.
AfterImageEffects UI draws after image effects. Functionally similar to AfterEverything for most projects.
BeforeImageEffects UI draws before image effects. Effects (bloom, tone-mapping) apply to the UI.
AfterDepthTexture UI draws after the depth texture is generated. Use when a custom shader needs depth.

Most projects keep the default. Adjust only when image effects need to apply to the UI, or when a custom rendering setup needs the UI in a specific slot.

Camera-target combinations

TickBIRPInjector adds its CommandBuffer to one camera at a time, and the buffer writes into that camera's currently bound target.

  • Single display camera. Common case. The buffer's render target is the screen. Layout and clipping work in screen pixels.
  • Camera with viewport rect. The camera renders into a sub-rect of the screen. The injector forwards the camera's pixelWidth/pixelHeight, which reflect the viewport, so the UI positions against the viewport rather than the full screen.
  • Camera renders to a RenderTexture. The buffer's target is the RenderTexture. The injector forwards the camera's pixelWidth/pixelHeight and flags the target as off-screen, so the UI positions correctly even when the texture's dimensions differ from the screen.
  • Multiple cameras. Attach the injector to the camera you want the UI on. Other cameras render normally without the UI.

For the model behind pixel-coordinate handling, refer to Render pipelines.

Troubleshooting

Nothing renders. : The BaseGameUI subclass and the TickBIRPInjector are on different GameObjects, or the host GameObject has no Camera. The injector finds the recorder via GetComponent<TickRecorder>() on the same GameObject and requires a Camera. Check both.

Scissor is wrong, or scissor leaks across frames. : The clip stack is unbalanced inside DoUI. Run with the TICK_DEBUGGER define and check for stack-leak asserts at end of frame. Refer to Stacks.

UI renders twice. : Two cameras both have an TickBIRPInjector. Attach the injector to one camera only.

Additional resources