Unity - DrawRenderers не работает с пользовательскими рендер таргетами (SRP)

Пытаюсь создать свой пайплайн с отложенным освещением. Пока что хочу отрисовать сцену в GBuffer и скопировать одну из текстур в бек буфер. Но в результате отображается пустая текстура, с тем цветом, которым я ее очищал. Рендеринг происходит только если вместо моих рендер текстур выбрать BuiltinRenderTextureType.CameraTarget.

Пробовал только с одним рендер таргет, без и с депсом. Так же пробовал отрисовать треугольник с CommandBuffer::DrawMesh, но это почему то не работает и с CameraTarget.

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

Что я упускаю?

public class ExampleRenderPipeline : RenderPipeline
{
    RenderTexture m_GBuffer0;
    RenderTexture m_GBuffer1;
    RenderTexture m_Depth;

    RenderTargetIdentifier m_GBuffer0_id;
    RenderTargetIdentifier m_GBuffer1_id;
    RenderTargetIdentifier m_Depth_id;
    int width = 0, height = 0;

    protected override void Render(ScriptableRenderContext context, Camera[] cameras)
    {
        Camera camera = cameras[0];

        if (width != camera.pixelWidth || height != camera.pixelHeight)
        {
            m_GBuffer0 = new RenderTexture(camera.pixelWidth, camera.pixelHeight, 1, RenderTextureFormat.Default);
            m_GBuffer1 = new RenderTexture(camera.pixelWidth, camera.pixelHeight, 1, RenderTextureFormat.Default);
            m_Depth = new RenderTexture(camera.pixelWidth, camera.pixelHeight, 1, RenderTextureFormat.Depth);

            m_GBuffer0_id = new RenderTargetIdentifier(m_GBuffer0);
            m_GBuffer1_id = new RenderTargetIdentifier(m_GBuffer1);
            m_Depth_id = new RenderTargetIdentifier(m_Depth);

            width = camera.pixelWidth;
            height = camera.pixelHeight;
        }

        // Clearing render targets with different colors (for debug)
        var cmd = new CommandBuffer();

        // Clear the first RT with blue
        cmd.SetRenderTarget(m_GBuffer0_id);
        cmd.ClearRenderTarget(true, true, Color.blue);

        // Clear the second RT with green
        cmd.SetRenderTarget(m_GBuffer1_id);
        cmd.ClearRenderTarget(true, true, Color.green);

        // Select both RTs and Depth buffer, clear only depth
        cmd.SetRenderTarget(new[] { m_GBuffer0_id, m_GBuffer1_id }, m_Depth);
        cmd.ClearRenderTarget(true, false, Color.clear, 1);

        context.ExecuteCommandBuffer(cmd);
        cmd.Release();

        // Drawing renderers
        ...
        context.DrawRenderers(cullingResults, ref drawingSettings, ref filteringSettings);

        //Blit to back buffer
        CommandBuffer cmdBlit = new CommandBuffer();
        cmdBlit.Blit(m_GBuffer0_id, BuiltinRenderTextureType.CameraTarget);
        context.ExecuteCommandBuffer(cmdBlit);
        cmdBlit.Release();

        context.Submit();
    }
}

Ответы (0 шт):