レンダーグラフシステムを使用するカスタムレンダーパスでオブジェクトを描画するには、描画するオブジェクトのリストを作成します。それには RendererListHandle API を使用します。
以下の手順に従ってください。
ScriptableRenderPass クラスで、パスデータに使用するクラスに RendererListHandle フィールドを作成します。
例:
private class PassData
{
public RendererListHandle objectsToDraw;
}
描画するオブジェクト、描画設定、カリングデータを含む RendererListParams オブジェクトを作成します。RenderListParams オブジェクトの詳細は、カスタムのレンダーパイプラインでのシンプルなレンダーループの作成 を参照してください。
詳細な例については、例 を参照してください。
RecordRenderGraph メソッドでは、CreateRendererListAPI を使用して、レンダーグラフシステムが使用できるハンドルに 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);
以下の Scriptable Renderer Feature は、オーバーライドマテリアルを使用して、Lightmode タグが UniversalForward に設定されているシーンにオブジェクトを再描画します。
Scriptable Reader Feature をレンダラーに追加 した後に、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 という例を参照してください。