Unity 6.3
0 онлайн 8 гостей 3 в системе
Вход

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.