렌더 그래프 시스템을 사용하는 커스텀 렌더 패스에서 오브젝트를 드로우하려면 RendererListHandle API를 사용하여 드로우할 오브젝트 목록을 생성하십시오.
다음 과정을 따르십시오.
ScriptableRenderPass 클래스에서 패스 데이터에 사용하는 클래스에 RendererListHandle 필드를 만듭니다.
예시:
private class PassData
{
public RendererListHandle objectsToDraw;
}
드로우할 오브젝트, 드로우 설정, 컬링 데이터를 포함하는 RendererListParams 오브젝트를 만듭니다. RenderListParams 오브젝트에 대한 상세 내용은 커스텀 렌더 파이프라인에서 간단한 렌더 루프 생성을 참고하십시오.
자세한 예시는 예시를 참조하십시오.
RecordRenderGraph 메서드에서 CreateRendererList API를 사용하여 RendererListParams 오브젝트를 렌더 그래프 시스템이 사용할 수 있는 핸들로 전환합니다.
예시:
RenderListHandle rendererListHandle = renderGraph.CreateRendererList(rendererListParameters);
패스 데이터에서 RendererListHandle 필드를 설정합니다.
예시:
passData.objectsToDraw = rendererListHandle;
패스 데이터에서 RendererListHandle을 설정한 후 목록에서 오브젝트를 드로우할 수 있습니다.
다음 과정을 따르십시오.
RecordRenderGraph 메서드에서 UseRendererList API를 사용하여 렌더 그래프 시스템에 오브젝트 목록을 사용하도록 지시합니다.
예시:
builder.UseRendererList(passData.rendererListHandle);
오브젝트를 드로우할 텍스처를 설정합니다. URP가 오브젝트를 올바르게 렌더링할 수 있도록 컬러 텍스처와 뎁스 텍스처를 모두 설정합니다.
예를 들어 다음은 활성 카메라 텍스처의 컬러 텍스처와 뎁스 텍스처를 드로우하도록 URP에 지시합니다.
UniversalResourceData frameData = frameContext.Get<UniversalResourceData>();
builder.SetRenderAttachment(frameData.activeColorTexture, 0);
builder.SetRenderAttachmentDepth(frameData.activeDepthTexture, AccessFlags.Write);
SetRenderFunc 메서드에서 DrawRendererList API를 사용하여 렌더러를 드로우합니다.
예시:
context.cmd.DrawRendererList(passData.rendererListHandle);
다음 스크립터블 렌더러 기능은 오버라이드 머티리얼을 사용하여 Lightmode 태그가 UniversalForward로 설정된 씬의 오브젝트를 다시 드로우합니다.
이 스크립터블 리더 기능을 렌더러에 추가한 뒤, Material To Use 파라미터를 원하는 머티리얼로 설정합니다.
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;
}
private 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((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);
}
}
}
다른 예시를 살펴보고 싶다면 렌더 그래프 시스템 URP 패키지 샘플의 RendererList를 참조하십시오.