ScriptableRenderContext.DrawRenderers
Declaration
Obsolete public void DrawRenderers(Rendering.CullingResults cullingResults, ref Rendering.DrawingSettings drawingSettings, ref Rendering.FilteringSettings filteringSettings);Obsolete public void DrawRenderers(Rendering.CullingResults cullingResults, ref Rendering.DrawingSettings drawingSettings, ref Rendering.FilteringSettings filteringSettings, ref Rendering.RenderStateBlock stateBlock);Obsolete public void DrawRenderers(Rendering.CullingResults cullingResults, ref Rendering.DrawingSettings drawingSettings, ref Rendering.FilteringSettings filteringSettings, NativeArray<ShaderTagId> renderTypes, NativeArray<RenderStateBlock> stateBlocks);Obsolete public void DrawRenderers(Rendering.CullingResults cullingResults, ref Rendering.DrawingSettings drawingSettings, ref Rendering.FilteringSettings filteringSettings, Rendering.ShaderTagId tagName, bool isPassTagName, NativeArray<ShaderTagId> tagValues, NativeArray<RenderStateBlock> stateBlocks);Параметры
| Параметр | Описание |
|---|---|
| cullingResults | Набор видимых объектов для рисования. Обычно вы получаете его из ScriptableRenderContext.Cull. |
| drawingSettings | Структура, описывающая, как отрисовывать объекты. |
| filteringSettings | Структура, описывающая, как отфильтровать набор видимых объектов, чтобы Unity отрисовывала только его часть. |
| stateBlock | Набор значений, которые Unity использует для переопределения состояния рендеринга GPU. |
| tagName | Имя SubShader Тега или Пропускного Тега. |
| isPassTagName | Если установлено true, tagName указывает Тег Пропуска. В противном случае, tagName указывает SubShader Тег. |
| tagValues | Массив структур ShaderTagId, где name является значением заданного SubShader Тега или Пропускного Тега. |
| renderTypes | Массив структур ShaderTagId, где name является значением SubShader Тега, имеющего имя "RenderType". |
| stateBlocks | Массив структур, описывающих, какие части состояния рендеринга GPU следует переопределить. |
Описание
Планирует отрисовку набора видимых объектов и при необходимости переопределяет состояние рендеринга GPU.
Эта функция формирует команды отрисовки указанной геометрии и добавляет их во внутренний список команд ScriptableRenderContext. ScriptableRenderContext выполняет все команды из своего внутреннего списка, когда ScriptableRenderContext.Submit называется.
Этот пример демонстрирует использование CommandBuffer чтобы очистить цель рендеринга, а затем вызвать эту функцию для рисования геометрии:
using UnityEngine; using UnityEngine.Rendering;
public class ExampleRenderPipeline : RenderPipeline { public ExampleRenderPipeline() { }
protected override void Render(ScriptableRenderContext context, Camera[] cameras) { // Create and schedule a command to clear the current render target var cmd = new CommandBuffer(); cmd.ClearRenderTarget(true, true, Color.black); context.ExecuteCommandBuffer(cmd); cmd.Release();
// Iterate over all Cameras foreach (Camera camera in cameras) { // Get the culling parameters from the current Camera camera.TryGetCullingParameters(out var cullingParameters);
// Use the culling parameters to perform a cull operation, and store the results var cullingResults = context.Cull(ref cullingParameters);
// Update the value of built-in shader variables, based on the current Camera context.SetupCameraProperties(camera);
// Tell Unity which geometry to draw, based on its LightMode Pass tag value ShaderTagId shaderTagId = new ShaderTagId("ExampleLightModeTag");
// Tell Unity how to sort the geometry, based on the current Camera var sortingSettings = new SortingSettings(camera);
// Create a DrawingSettings struct that describes which geometry to draw and how to draw it DrawingSettings drawingSettings = new DrawingSettings(shaderTagId, sortingSettings);
// Tell Unity how to filter the culling results, to further specify which geometry to draw // Use FilteringSettings.defaultValue to specify no filtering FilteringSettings filteringSettings = FilteringSettings.defaultValue;
// Schedule a command to draw the geometry, based on the settings you have defined context.DrawRenderers(cullingResults, ref drawingSettings, ref filteringSettings);
// Schedule a command to draw the Skybox if required if (camera.clearFlags == CameraClearFlags.Skybox && RenderSettings.skybox != null) { context.DrawSkybox(camera); }
// Instruct the graphics API to perform all scheduled commands context.Submit(); } } }
Переопределение состояния рендеринга
Когда вы рисуете геометрию с помощью этой функции, вы можете использовать один или несколько RenderStateBlock структуры, чтобы переопределить состояние рендеринга GPU следующими способами:
- Вы можете использовать
stateBlockпараметра для обеспечения единого RenderStateBlock структура. Unity использует состояние рендеринга, заданное вstateBlockдля всех геометрий, которые рисует эта функция. - Через параметр
stateBlocksможно передать массив структур RenderStateBlock, а через параметрrenderTypes— массив значений для SubShader Tag с именемRenderType. Для каждого элемента массиваrenderTypes: если Unity находит геометрию с именем SubShader Tag, равнымRenderType, и совпадающим значением, она использует состояние рендеринга, заданное соответствующим элементом массиваstateBlocks. При наличии нескольких совпадений Unity использует первое. Если элемент массиваrenderTypesимеет стандартное значение ShaderTagId, Unity расценивает его как универсальное совпадение и применяет соответствующее состояние рендеринга ко всей геометрии. - Вы можете использовать параметр
stateBlocksдля предоставления массива структур RenderStateBlock, а также использовать параметрыtagName,tagValuesиisPassTagNameдля указания имени и значений любых SubShader Тег или Пропускной Тег. Для каждого элемента в массивахtagNamesиtagValues, Unity находит геометрию с подходящим именем и значением тега SubShader или тега прохода и применяет состояние рендеринга, заданное в соответствующем элементе массиваstateBlocks. При наличии нескольких соответствий, Unity использует первый. Если элемент вtagValuesимеет значение по умолчанию для ShaderTagId, Unity считает это универсальным вариантом и применяет соответствующее состояние рендеринга ко всей геометрии.
Этот пример показывает, как переопределить состояние рендеринга:
using UnityEngine; using UnityEngine.Rendering; using Unity.Collections;
public class OverrideRenderStateExample { ScriptableRenderContext scriptableRenderContext;
// Override the render state for all geometry that this function draws public void OverrideRenderStateForAll(CullingResults exampleCullingResults, DrawingSettings exampleDrawingSettings, FilteringSettings exampleFilteringSettings) { // Tell Unity how to override the render state var stateBlock = new RenderStateBlock(RenderStateMask.Depth); stateBlock.depthState = new DepthState(true, CompareFunction.LessEqual);
// Schedule a command to draw the geometry using the desired render state // Unity will execute all scheduled commands during the next call to ScriptableRenderContext.Submit scriptableRenderContext.DrawRenderers(exampleCullingResults, ref exampleDrawingSettings, ref exampleFilteringSettings, ref stateBlock); }
// Override the render state for all geometry that has a SubShader Tag // with a name of "RenderType" and a value of "ExampleRenderTypeTagValue" public void OverrideRenderStateUsingRenderTypeTag(CullingResults exampleCullingResults, DrawingSettings exampleDrawingSettings, FilteringSettings exampleFilteringSettings) { // Create the parameters that tell Unity how to override the render state var stateBlock = new RenderStateBlock(RenderStateMask.Depth); stateBlock.depthState = new DepthState(true, CompareFunction.Greater); var stateBlocks = new NativeArray<RenderStateBlock>(1, Allocator.Temp); stateBlocks[0] = stateBlock;
// Create the parameters that tell Unity when to override the render state ShaderTagId renderType = new ShaderTagId("ExampleRenderTypeTagValue"); var renderTypes = new NativeArray<ShaderTagId>(1, Allocator.Temp); renderTypes[0] = renderType;
// Schedule a command to draw the geometry using the desired render state // Unity will execute all scheduled commands during the next call to ScriptableRenderContext.Submit scriptableRenderContext.DrawRenderers(exampleCullingResults, ref exampleDrawingSettings, ref exampleFilteringSettings, renderTypes, stateBlocks);
// DrawRenderers copies the array contents, so it is safe to dispose of the native arrays stateBlocks.Dispose(); renderTypes.Dispose(); }
// Override the render state in two different ways. // Use one state for all geometry that has a Pass Tag // with a name of "ExamplePassTagName" and a value of "ExamplePassTagValue". // For all other geometry, use a second state. public void OverrideRenderStateUsingPassTag(CullingResults exampleCullingResults, DrawingSettings exampleDrawingSettings, FilteringSettings exampleFilteringSettings) { // Create the parameters that tell Unity how to override the render state var stateBlock0 = new RenderStateBlock(RenderStateMask.Depth); stateBlock0.depthState = new DepthState(true, CompareFunction.Greater); var stateBlock1 = new RenderStateBlock(RenderStateMask.Depth); stateBlock1.depthState = new DepthState(true, CompareFunction.Less); var stateBlocks = new NativeArray<RenderStateBlock>(2, Allocator.Temp); stateBlocks[0] = stateBlock0; stateBlocks[1] = stateBlock1; // default override
// Create the parameters that tell Unity when to override the render state ShaderTagId tagName = new ShaderTagId("ExamplePassTagName"); bool isPassTagName = true; var tagValues = new NativeArray<ShaderTagId>(2, Allocator.Temp); tagValues[0] = new ShaderTagId("ExamplePassTagValue"); tagValues[1] = new ShaderTagId(); // catch all
// Schedule a command to draw the geometry using the desired render state // Unity will execute all scheduled commands during the next call to ScriptableRenderContext.Submit scriptableRenderContext.DrawRenderers(exampleCullingResults, ref exampleDrawingSettings, ref exampleFilteringSettings, tagName, isPassTagName, tagValues, stateBlocks);
// DrawRenderers copies the array contents, so it is safe to dispose of the native arrays stateBlocks.Dispose(); tagValues.Dispose(); } }
Дополнительные ресурсы: Создание простого цикла рендеринга в пользовательском Scriptable Render Pipeline CullingResults, DrawingSettings, FilteringSettings, RenderStateBlock.