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

Написать проход рендеринга с использованием системы графов рендеринга в URP

На этой странице описывается, как написать проход рендеринга с использованием системы графов рендеринга.

Чтобы проиллюстрировать описание, на странице используется пример прохода рендеринга, который копирует активную цветовую текстуру камеры в текстуру назначения. Для упрощения кода в этом примере не используется текстура назначения в других местах кадра. Вы можете использовать отладчик кадров для проверки его содержимого.

Объявление прохода рендеринга отображения

Объявите проход рендеринга как класс, наследующий ScriptableRenderPass class.

Объявление ресурсов, используемых в проходе отображения

Внутри прохода рендеринга объявите класс, содержащий ресурсы, которые этот проход использует.

Ресурсами могут быть обычные переменные C# и ссылки на ресурсы графа отображения. Система графа отображения может получить доступ к этой структуре данных во время выполнения кода отображения. Убедитесь, что вы объявляете только те переменные, которые использует проход отображения. Добавление ненужных переменных может снизить производительность.

class PassData
{
    public TextureHandle copySourceTexture;
}

Метод RecordRenderGraph заполняет данные, и граф рендеринга передает их в качестве параметра функции рендеринга.

Реализация метода RecordRenderGraph

Используйте метод RecordRenderGraph для добавления и настройки одного или нескольких проходов рендеринга в системе графа рендеринга.

Unity вызывает этот метод во время настройки графа рендеринга и позволяет зарегистрировать соответствующие прохождения и ресурсы для выполнения графа рендеринга. Используйте этот метод для реализации пользовательского рендеринга.

В методе RecordRenderGraph вы объявляете входы и выходы рендеринга, но не добавляете команды в буферы команд.

В следующем разделе описываются основные элементы метода RecordRenderGraph и приводится пример реализации.

Переменная конструктора графа отображения добавляет кадровые ресурсы

builder переменная является экземпляром IRasterRenderGraphBuilder интерфейс. Эта переменная — точка входа для настройки сведений, относящихся к проходу рендеринга.

UniversalResourceData класс содержит все текстурные ресурсы, используемые URP, включая активные текстуры цвета и глубины камеры.

UniversalCameraData класс содержит данные, относящиеся к активной в данный момент камере.

Для демонстрационных целей в этом примере создается временная текстура назначения. Метод builder.UseTexture заявляет, что этот проход рендеринга использует исходную текстуру как вход только для чтения:

builder.UseTexture(passData.copySourceTexture);

В этом примере метод builder.SetRenderAttachment заявляет, что этот проход рендеринга использует временную текстуру назначения в качестве цели цветового рендеринга.

Заявление функции отображения, которая генерирует команды отображения для прохода отображения

Заявление функции отображения, которая генерирует команды отображения для прохода отображения.

static void ExecutePass(PassData data, RasterGraphContext context)
{
    // Records a rendering command to copy, or blit, the contents of the source texture
    // to the color render target of the render pass.
    Blitter.BlitTexture(context.cmd, data.copySourceTexture,
        new Vector4(1, 1, 0, 0), 0, false);
}

SetRenderFunc метод в RecordRenderGraph метод устанавливает ExecutePass метод как функцию отрисовки, которую граф рендеринга вызывает при выполнении прохода. Используйте статический метод или статическую лямбда-функцию.

builder.SetRenderFunc(static (PassData data, RasterGraphContext context) => ExecutePass(data, context));

Полный пример метода RecordRenderGraph:

// This method adds and configures one or more render passes in the render graph.
// This process includes declaring their inputs and outputs,
// but does not include adding commands to command buffers.
public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameContext)
{
    string passName = "Copy To Debug Texture";

    // Add a raster render pass to the render graph. The PassData type parameter determines
    // the type of the passData output variable.
    using (var builder = renderGraph.AddRasterRenderPass<PassData>(passName,
        out var passData))
    {
        // UniversalResourceData contains all the texture references used by URP,
        // including the active color and depth textures of the camera.
        UniversalResourceData frameData = frameContext.Get<UniversalResourceData>();

        // Populate passData with the data needed by the rendering function
        // of the render pass.
        // Use the camera's active color texture
        // as the source texture for the copy operation.
        passData.copySourceTexture = frameData.activeColorTexture;

        // Create a destination texture for the copy operation based on the settings,
        // such as dimensions, of the textures that the camera uses.
        // Set depthBufferBits to 0 to ensure that the CreateRenderGraphTexture method
        // creates a color texture and not a depth texture.
        TextureDesc desc = frameData.cameraDepthTexture.GetDescriptor(renderGraph);
        desc.depthBufferBits = 0;
        TextureHandle destination = renderGraph.CreateTexture(desc);

        // Declare that this render pass uses the source texture as a read-only input.
        builder.UseTexture(passData.copySourceTexture);

        // Declare that this render pass uses the temporary destination texture
        // as its color render target.
        // This is similar to cmd.SetRenderTarget prior to the RenderGraph API.
        builder.SetRenderAttachment(destination, 0);

        // Make sure the render graph system keeps the render pass, even if it's not used in the final frame.
        // Don't use this in production code, because it prevents the render graph system from removing the render pass if it's not needed. 
        builder.AllowPassCulling(false);

        // Set the ExecutePass method as the rendering function that render graph calls
        // for the render pass. 
        // This sample uses a lambda expression to avoid memory allocations.
        builder.SetRenderFunc(static (PassData data, RasterGraphContext context)
            => ExecutePass(data, context));
    }
}

Вставьте скриптовый экземпляр прохода рендеринга в рендерер

Чтобы вставить скриптовый экземпляр прохода рендеринга в рендерер, используйте метод AddRenderPasses из реализации Renderer Feature. URP вызывает метод AddRenderPasses каждый кадр, один раз для каждого Camera.

public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
    renderer.EnqueuePass(m_CopyRenderPass);
}

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