Table of Contents

调试渲染器

**调试渲染器(Debug renderer)**是一个占位渲染器,可配合脚本打印调试信息。默认情况下,调试渲染器作为游戏入口点的子级包含在图形合成器中。

调试渲染器

创建调试渲染器

要创建调试渲染器,请右键单击图形合成器编辑器,然后选择 Debug renderer。

创建调试渲染器

将调试渲染器连接到入口点

在大多数情况下,你希望调试渲染器与一个或多个前向渲染器共享同一个入口点。为此,请使用场景渲染器集合,并将调试渲染器和前向渲染器选为子级,如下图所示:

调试渲染器 Property Grid

使用调试渲染器

要使用调试渲染器,请在脚本中引用它并添加调试渲染阶段。

例如,Stride 自带的 Debug physics shapes 脚本就使用调试渲染器在运行时显示碰撞体形状。

using System.Linq;
using System.Threading.Tasks;
using Stride.Input;
using Stride.Engine;
using Stride.Physics;
using Stride.Rendering;
using Stride.Rendering.Compositing;

namespace MyGame
{
    public class DebugPhysicsShapes : AsyncScript
    {
        public RenderGroup RenderGroup = RenderGroup.Group7;

        public override async Task Execute()
        {
        // 如果存在 debug 入口点,则在其中设置渲染
        var compositor = SceneSystem.GraphicsCompositor;
        var debugRenderer =
            ((compositor.Game as SceneCameraRenderer)?.Child as SceneRendererCollection)?.Children.Where(
                x => x is DebugRenderer).Cast<DebugRenderer>().FirstOrDefault();
        if (debugRenderer == null)
            return;

        var shapesRenderState = new RenderStage("PhysicsDebugShapes", "Main");
            compositor.RenderStages.Add(shapesRenderState);
            var meshRenderFeature = compositor.RenderFeatures.OfType<MeshRenderFeature>().First();
            meshRenderFeature.RenderStageSelectors.Add(new SimpleGroupToRenderStageSelector
            {
                EffectName = "StrideForwardShadingEffect",
                RenderGroup = (RenderGroupMask)(1 << (int)RenderGroup),
                RenderStage = shapesRenderState,
            });
            meshRenderFeature.PipelineProcessors.Add(new WireframePipelineProcessor { RenderStage = shapesRenderState });
            debugRenderer.DebugRenderStages.Add(shapesRenderState);

            var simulation = this.GetSimulation();
            if (simulation != null)
                simulation.ColliderShapesRenderGroup = RenderGroup;

            var enabled = false;
            while (Game.IsRunning)
            {
                if (Input.IsKeyDown(Keys.LeftShift) && Input.IsKeyDown(Keys.LeftCtrl) && Input.IsKeyReleased(Keys.P))
                {
                    if (simulation != null)
                    {
                        if (enabled)
                        {
                            simulation.ColliderShapesRendering = false;
                            enabled = false;
                        }
                        else
                        {
                            simulation.ColliderShapesRendering = true;
                            enabled = true;
                        }
                    }
                }

                await Script.NextFrame();
            }
        }
    }
}

有关如何使用此脚本的信息,请参阅碰撞体。

另请参阅