Unity 6.3
0 онлайн 42 гостей 3 в системе
Вход

Рисовать объекты в графической системе рендеринга в URP

Чтобы рисовать объекты в пользовательском проходе рендеринга, использующем систему графов рендеринга, используйте RendererListHandle API для создания списка объектов для рисования.

Создание списка объектов для рисования

Выполните следующие действия:

  1. В вашем ScriptableRenderPass класс, в классе, который вы используете для данных прохода, создайте RendererListHandle поле.

    Например:

    class PassData
    {
        public RendererListHandle objectsToDraw;
    }
    
  2. Создайте объект RendererListParams, который содержит рисуемые объекты, параметры рисования и данные удаления. Дополнительные сведения об объекте RenderListParams см. в разделе Создание простого цикла отображения в пользовательском конвейере отображения.

    Подробный пример см. в Пример.

  3. В методе RecordRenderGraph используйте CreateRendererList API для преобразования объекта RendererListParams в манипулятор, который может использовать система отображения графа.

    Например:

    RendererListHandle 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 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 образцы пакета.

Дополнительные ресурсы