Version: Unity 6.0 (6000.0)
言語 : 日本語
URP のフレームデータテクスチャのリファレンス
URP のレンダーグラフシステムのコンピュートシェーダー

URP のレンダーグラフシステムでオブジェクトを描画する

レンダーグラフシステムを使用するカスタムレンダーパスでオブジェクトを描画するには、描画するオブジェクトのリストを作成します。それには RendererListHandle API を使用します。

描画するオブジェクトのリストを作成する

以下の手順に従ってください。

  1. ScriptableRenderPass クラスで、パスデータに使用するクラスに RendererListHandle フィールドを作成します。

    例:

    private class PassData
    {
        public RendererListHandle objectsToDraw;
    }
    
  2. 描画するオブジェクト、描画設定、カリングデータを含む RendererListParams オブジェクトを作成します。RenderListParams オブジェクトの詳細は、カスタムのレンダーパイプラインでのシンプルなレンダーループの作成 を参照してください。

    詳細な例については、 を参照してください。

  3. RecordRenderGraph メソッドでは、CreateRendererListAPI を使用して、レンダーグラフシステムが使用できるハンドルに RendererListParams オブジェクトを変換します。

    例:

    RenderListHandle rendererListHandle = renderGraph.CreateRendererList(rendererListParameters);
    
  4. パスデータに RendererListHandle フィールドを設定します。

    例:

    passData.objectsToDraw = rendererListHandle;
    

オブジェクトを描画する

パスデータに RendererListHandle を設定したら、リスト内のオブジェクトを描画できます。

以下の手順に従ってください。

  1. RecordRenderGraph メソッドで、UseRendererList API を使用して、オブジェクトのリストを使用するようにレンダーグラフシステムに指示します。

    例:

    builder.UseRendererList(passData.rendererListHandle);
    
  2. オブジェクトを描画するテクスチャを設定します。URP がオブジェクトを正しくレンダリングするように、色テクスチャと深度テクスチャの両方を設定します。

    例えば、アクティブなカメラテクスチャの色テクスチャと深度テクスチャに描画するために、URP に以下のように指示します。

    UniversalResourceData frameData = frameContext.Get<UniversalResourceData>();
    builder.SetRenderAttachment(frameData.activeColorTexture, 0);
    builder.SetRenderAttachmentDepth(frameData.activeDepthTexture, AccessFlags.Write);
    
  3. 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 という例を参照してください。

追加リソース

URP のフレームデータテクスチャのリファレンス
URP のレンダーグラフシステムのコンピュートシェーダー