Написать проход рендеринга с использованием системы графов рендеринга в 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);
}