Объявление
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
public void DrawRenderers(Rendering.CullingResults cullingResults, ref Rendering.DrawingSettings drawingSettings, ref Rendering.FilteringSettings filteringSettings, Rendering.ShaderTagId tagName, bool isPassTagName, NativeArray
Параметры
cullingResults | Набор видимых объектов для рисования. Обычно вы получаете его из ScriptableRenderContext.Cull. |
drawingSettings | Структура, которая описывает, как рисовать объекты. |
filteringSettings | Структура, описывающая, как фильтровать набор видимых объектов, чтобы Unity рисовала только подмножество. |
stateBlock | Набор значений, которые Unity использует для переопределения состояния рендеринга графического процессора. |
tagName | Имя SubShader Tag или Pass Tag. |
isPassTagName | Если задано значение true, tagName указывает Pass Tag. В противном случае tagName указывает SubShader Tag. |
tagValues | Массив структур ShaderTagId, где name — это значение заданного SubShader Tag или Pass Tag. |
renderTypes | Массив структур ShaderTagId, где name является значением SubShader Tag с именем "RenderType". |
stateBlocks | Массив структур, описывающих, какие части состояния рендеринга графического процессора следует переопределить. |
Описание
Планирует отрисовку набора видимых объектов и при необходимости переопределяет состояние рендеринга графического процессора.
Эта функция создает команды для рисования указанной геометрии и добавляет команды во внутренний список команд ScriptableRenderContext
. ScriptableRenderContext
выполняет все команды из своего внутреннего списка при вызове ScriptableRenderContext.Submit.
Полный пример, демонстрирующий использование этой функции в контексте, см. в разделе Создание простого цикла рендеринга в пользовательском конвейере рендеринга. В этом коротком примере показано использование CommandBuffer для установки матрицы представления, а затем вызов этой функции для рисования геометрии с использованием этой матрицы:
using UnityEngine;
using UnityEngine.Rendering;
public class ExecuteCommandBufferExample
{
ScriptableRenderContext scriptableRenderContext;
// Placeholder data
DrawingSettings exampleDrawingSettings;
CullingResults exampleCullingResults = new CullingResults();
FilteringSettings exampleFilteringSettings = new FilteringSettings();
public void Draw()
{
// Create a CommandBuffer to set the view matrix
Matrix4x4 exampleViewMatrix = Matrix4x4.Scale(new Vector3(2f, 2f, 2f));
CommandBuffer myCommandBuffer = new CommandBuffer();
myCommandBuffer.SetViewMatrix(exampleViewMatrix);
// Schedule the execution of the CommandBuffer
scriptableRenderContext.ExecuteCommandBuffer(myCommandBuffer);
myCommandBuffer.Clear();
// Schedule the drawing operation
scriptableRenderContext.DrawRenderers(exampleCullingResults, ref exampleDrawingSettings, ref exampleFilteringSettings);
// Perform all scheduled tasks, in the order that they were scheduled
// This means that the CommandBuffer is executed before the drawing operation occurs
scriptableRenderContext.Submit();
}
}
Переопределение состояния рендеринга Когда вы рисуете геометрию с помощью этой функции, вы можете использовать одну или несколько структур RenderStateBlock для переопределения состояния рендеринга графического процессора следующими способами:
- Вы можете использовать параметр
stateBlock
для предоставления одной структуры RenderStateBlock. Unity использует состояние рендеринга, определенное вstateBlock
, для всей геометрии, которую рисует эта функция. - Вы можете использовать параметр
stateBlocks
для предоставления массива структур RenderStateBlock иrenderTypes
для предоставления массива значений для тега SubShader с именемrenderTypes
. Для каждого элемента в массивеrenderTypes
, если Unity находит геометрию с именем тега SubShaderRenderType
и совпадающим значением, он использует состояние рендеринга, определенное в соответствующем элементе массиваstateBlocks
. Если совпадений несколько, Unity использует первое. Если элемент в массивеrenderTypes
имеет значение по умолчанию для ShaderTagId, Unity рассматривает это как универсальное и использует соответствующее состояние визуализации для всей геометрии. - Вы можете использовать параметр
stateBlocks
для предоставления массива структур RenderStateBlock, а также использоватьtagName
,tagValues
иisPassTagName
, чтобы указать имя и значения любого SubShader Tag или Pass Tag. Для каждого элемента в массивахtagNames
иtagValues
Unity идентифицирует геометрию с помощью соответствующего имени и значения тега SubShader или тега Pass, а также применяет состояние рендеринга, определенное в соответствующем элементе массиваstateBlocks
. Если совпадений несколько, Unity использует первое. Если элемент вtagValues
имеет значение по умолчанию для ShaderTagId, Unity рассматривает это как универсальное и использует соответствующее состояние визуализации для всей геометрии.
В этом примере показано, как переопределить состояние рендеринга:
using UnityEngine;
using UnityEngine.Rendering;
using Unity.Collections;
public class OverrideRenderStateExample
{
ScriptableRenderContext scriptableRenderContext;
// Placeholder data
DrawingSettings exampleDrawingSettings;
CullingResults exampleCullingResults = new CullingResults();
FilteringSettings exampleFilteringSettings = new FilteringSettings();
// Override the render state for all geometry that this function draws
public void OverrideRenderStateForAll()
{
// 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()
{
// 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()
{
// 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();
}
}
Смотрите так же: CullingResults, DrawingSettings, FilteringSettings, RenderStateBlock.