public void DrawRenderers (Rendering.CullingResults cullingResults, ref Rendering.DrawingSettings drawingSettings, ref Rendering.FilteringSettings filteringSettings);
public void DrawRenderers (Rendering.CullingResults cullingResults, ref Rendering.DrawingSettings drawingSettings, ref Rendering.FilteringSettings filteringSettings, ref Rendering.RenderStateBlock stateBlock);
public void DrawRenderers (Rendering.CullingResults cullingResults, ref Rendering.DrawingSettings drawingSettings, ref Rendering.FilteringSettings filteringSettings, NativeArray<ShaderTagId> renderTypes, NativeArray<RenderStateBlock> stateBlocks);

参数

cullingResults指定要绘制哪组可见对象(通常从 Cull 获取)。
drawingSettings指定绘制 GameObjects 的方式。
filteringSettings指定渲染管线应如何在场景中进一步过滤渲染器。
stateBlock指定要重载渲染状态的哪些部分。
renderTypes指定重写其渲染状态的渲染类型。
stateBlocks指定要针对特定渲染类型重载渲染状态的哪些部分。

描述

调度可见 GameObjects 的子通道的开头。

ScriptableRenderContext.DrawRenderers 调用过程中,ScriptableRenderContext 会将绘制参数注册到自己要执行的命令内部列表中。 这些命令的实际执行在 ScriptableRenderContext.Submit 期间执行。

如果提供状态块,则将针对渲染管线在函数调用期间绘制的所有 GameObjects 重写渲染状态。如果提供 RenderTypes 数组,则将针对以下 GameObjects 重写渲染状态:其中子着色器的 RenderType 与数组中的某个值匹配。如果有多个映射匹配,则 Unity 使用第一个。renderType 设置为 null 的映射与所有值都匹配。

如果绘制调用取决于在 CommandBuffer 中指定的管线的状态,请确保在 DrawRenderers 之前调用 ExecuteCommandBuffer。 以下代码示例说明按错误顺序提交命令的情况;接下来说明行为符合预期的情况:

using UnityEngine;
using UnityEngine.Rendering;

internal class ExecuteCommandBufferExample { // TODO: replace with actual settings ScriptableRenderContext scriptableRenderContext; DrawingSettings drawingSettings; CullingResults cullingResults = new CullingResults(); FilteringSettings filteringSettings = new FilteringSettings();

Matrix4x4 myViewMatrix = Matrix4x4.Scale(new Vector3(2f, 2f, 2f));

public void DrawRenderersExampleIncorrect() { CommandBuffer myCommandBuffer = new CommandBuffer();

myCommandBuffer.SetViewMatrix(myViewMatrix);

scriptableRenderContext.DrawRenderers(cullingResults, ref drawingSettings, ref filteringSettings); // NO! When scriptableRenderContext submits the DrawRenderers command, it will not know about myViewMatrix :(

scriptableRenderContext.ExecuteCommandBuffer(myCommandBuffer); myCommandBuffer.Clear(); }

public void DrawRenderersExampleBetter() { CommandBuffer myCommandBuffer = new CommandBuffer();

myCommandBuffer.SetViewMatrix(myViewMatrix);

scriptableRenderContext.ExecuteCommandBuffer(myCommandBuffer); myCommandBuffer.Clear();

scriptableRenderContext.DrawRenderers(cullingResults, ref drawingSettings, ref filteringSettings); // OK! During next scriptableRenderContext.Submit() call, scriptableRenderContext will set myViewMatrix *before* drawing the renderers. } }