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 方法中,使用 CreateRendererList APIRendererListParams 对象转换为渲染图形系统可以使用的句柄。

    例如:

    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 的渲染图系统中的计算着色器
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961