Рисовать объекты в графической системе рендеринга в URP
Чтобы рисовать объекты в пользовательском проходе рендеринга, использующем систему графов рендеринга, используйте RendererListHandle API для создания списка объектов для рисования.
Создание списка объектов для рисования
Выполните следующие действия:
-
В вашем
ScriptableRenderPassкласс, в классе, который вы используете для данных прохода, создайтеRendererListHandleполе.Например:
class PassData { public RendererListHandle objectsToDraw; } -
Создайте объект RendererListParams, который содержит рисуемые объекты, параметры рисования и данные удаления. Дополнительные сведения об объекте
RenderListParamsсм. в разделе Создание простого цикла отображения в пользовательском конвейере отображения.Подробный пример см. в Пример.
-
В методе
RecordRenderGraphиспользуйтеCreateRendererListAPI для преобразования объектаRendererListParamsв манипулятор, который может использовать система отображения графа.Например:
RendererListHandle rendererListHandle = renderGraph.CreateRendererList(rendererListParameters); -
Установите поле
RendererListHandleв данных прохода.Например:
passData.objectsToDraw = rendererListHandle;
Нарисовать объекты
После того, как вы установите RendererListHandle в данных прохода, вы можете рисовать объекты в списке.
Выполните следующие действия:
-
В методе
RecordRenderGraphукажите системе отображения графа использовать список объектов, используяUseRendererListAPI.Например:
builder.UseRendererList(passData.rendererListHandle); -
Установить текстуру, на которую будут рисоваться объекты. Установить как цветовую текстуру, так и текстуру глубины, чтобы URP правильно отображал объекты.
Например, следующая команда говорит URP нарисовать текстуру цвета и текстуру глубины текстуры активной камеры.
UniversalResourceData frameData = frameContext.Get<UniversalResourceData>(); builder.SetRenderAttachment(frameData.activeColorTexture, 0); builder.SetRenderAttachmentDepth(frameData.activeDepthTexture, AccessFlags.Write); -
В вашем методе
SetRenderFuncнарисуйте рендеры с помощьюDrawRendererListAPI.Например:
context.cmd.DrawRendererList(passData.rendererListHandle);
Пример
Следующая Scriptable Renderer Feature перерисовывает объекты в сцене, которые имеют свои Lightmode tag set для UniversalForward, using an override material.
После тебя добавить эту возможность Scriptable Reader в рендерер, установить Материал для использования параметр к любому материалу.
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
using UnityEngine.Rendering.RenderGraphModule;
public class DrawObjectsWithOverrideMaterial : ScriptableRendererFeature
{
DrawObjectsPass drawObjectsPass;
public Material overrideMaterial;
public override void Create()
{
// Create the render pass that draws the objects, and pass in the override material
drawObjectsPass = new DrawObjectsPass(overrideMaterial);
// Insert render passes after URP's post-processing render pass
drawObjectsPass.renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing;
}
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
// Add the render pass to the URP rendering loop
renderer.EnqueuePass(drawObjectsPass);
}
class DrawObjectsPass : ScriptableRenderPass
{
private Material materialToUse;
public DrawObjectsPass(Material overrideMaterial)
{
// Set the pass's local copy of the override material
materialToUse = overrideMaterial;
}
class PassData
{
// Create a field to store the list of objects to draw
public RendererListHandle rendererListHandle;
}
public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameContext)
{
using (var builder = renderGraph.AddRasterRenderPass<PassData>("Redraw objects", out var passData))
{
// Get the data needed to create the list of objects to draw
UniversalRenderingData renderingData = frameContext.Get<UniversalRenderingData>();
UniversalCameraData cameraData = frameContext.Get<UniversalCameraData>();
UniversalLightData lightData = frameContext.Get<UniversalLightData>();
SortingCriteria sortFlags = cameraData.defaultOpaqueSortFlags;
RenderQueueRange renderQueueRange = RenderQueueRange.opaque;
FilteringSettings filterSettings = new FilteringSettings(renderQueueRange, ~0);
// Redraw only objects that have their LightMode tag set to UniversalForward
ShaderTagId shadersToOverride = new ShaderTagId("UniversalForward");
// Create drawing settings
DrawingSettings drawSettings = RenderingUtils.CreateDrawingSettings(shadersToOverride, renderingData, cameraData, lightData, sortFlags);
// Add the override material to the drawing settings
drawSettings.overrideMaterial = materialToUse;
// Create the list of objects to draw
var rendererListParameters = new RendererListParams(renderingData.cullResults, drawSettings, filterSettings);
// Convert the list to a list handle that the render graph system can use
passData.rendererListHandle = renderGraph.CreateRendererList(rendererListParameters);
// Set the render target as the color and depth textures of the active camera texture
UniversalResourceData resourceData = frameContext.Get<UniversalResourceData>();
builder.UseRendererList(passData.rendererListHandle);
builder.SetRenderAttachment(resourceData.activeColorTexture, 0);
builder.SetRenderAttachmentDepth(resourceData.activeDepthTexture, AccessFlags.Write);
builder.SetRenderFunc(static (PassData data, RasterGraphContext context) => ExecutePass(data, context));
}
}
static void ExecutePass(PassData data, RasterGraphContext context)
{
// Clear the render target to black
context.cmd.ClearRenderTarget(true, true, Color.black);
// Draw the objects in the list
context.cmd.DrawRendererList(data.rendererListHandle);
}
}
}
Для другого примера, см. пример, названный RendererList в рендер графической системы URP образцы пакета.