Debug renderer

The debug renderer is a placeholder renderer you can use with scripts to print debug information. By default, the debug renderer is included in the graphics compositor as a child of the game entry point.

Debug renderer

Create a debug renderer

To create a debug renderer, right-click the graphics compositor editor and select Debug renderer.

Create debug renderer

Connect a debug renderer to an entry point

In most cases, you want the debug renderer to share an entry point with one or more forward renderers. To do this, use a scene renderer collection and select the debug renderer and forward renderer(s) as children, as in the screenshot below:

Debug renderer Property Grid

Use a debug renderer

To use the debug renderer, reference it in your script and add debug render stages.

For example, the Debug physics shapes script included in Xenko uses the debug renderer to display collider shapes at runtime.

  1. using System.Linq;
  2. using System.Threading.Tasks;
  3. using Xenko.Input;
  4. using Xenko.Engine;
  5. using Xenko.Physics;
  6. using Xenko.Rendering;
  7. using Xenko.Rendering.Compositing;
  8. namespace MyGame
  9. {
  10. public class DebugPhysicsShapes : AsyncScript
  11. {
  12. public RenderGroup RenderGroup = RenderGroup.Group7;
  13. public override async Task Execute()
  14. {
  15. //set up rendering in the debug entry point if we have it
  16. var compositor = SceneSystem.GraphicsCompositor;
  17. var debugRenderer =
  18. ((compositor.Game as SceneCameraRenderer)?.Child as SceneRendererCollection)?.Children.Where(
  19. x => x is DebugRenderer).Cast<DebugRenderer>().FirstOrDefault();
  20. if (debugRenderer == null)
  21. return;
  22. var shapesRenderState = new RenderStage("PhysicsDebugShapes", "Main");
  23. compositor.RenderStages.Add(shapesRenderState);
  24. var meshRenderFeature = compositor.RenderFeatures.OfType<MeshRenderFeature>().First();
  25. meshRenderFeature.RenderStageSelectors.Add(new SimpleGroupToRenderStageSelector
  26. {
  27. EffectName = "XenkoForwardShadingEffect",
  28. RenderGroup = (RenderGroupMask)(1 << (int)RenderGroup),
  29. RenderStage = shapesRenderState,
  30. });
  31. meshRenderFeature.PipelineProcessors.Add(new WireframePipelineProcessor { RenderStage = shapesRenderState });
  32. debugRenderer.DebugRenderStages.Add(shapesRenderState);
  33. var simulation = this.GetSimulation();
  34. if (simulation != null)
  35. simulation.ColliderShapesRenderGroup = RenderGroup;
  36. var enabled = false;
  37. while (Game.IsRunning)
  38. {
  39. if (Input.IsKeyDown(Keys.LeftShift) && Input.IsKeyDown(Keys.LeftCtrl) && Input.IsKeyReleased(Keys.P))
  40. {
  41. if (simulation != null)
  42. {
  43. if (enabled)
  44. {
  45. simulation.ColliderShapesRendering = false;
  46. enabled = false;
  47. }
  48. else
  49. {
  50. simulation.ColliderShapesRendering = true;
  51. enabled = true;
  52. }
  53. }
  54. }
  55. await Script.NextFrame();
  56. }
  57. }
  58. }
  59. }

For information about how to use this script, see Colliders.

See also