Unity 6.3
0 онлайн 95 гостей 3 в системе
Вход
Конвейеры отображения Шаг 49 из 129

Обновление до URP 14 (Unity 2022.2)

На этой странице описано, как обновить старую версию Universal Render Pipeline (URP) до URP 14 (Unity 2022.2).

Информацию о преобразовании ассетов, созданных для проекта Built-in Render Pipeline, в ассеты, совместимые с URP, см. на странице Render Pipeline Converter.

Обновление с URP 13 (Unity 2022.1)

Два определения шейдера были удалены

Определения шейдеров SHADER_QUALITY_LOW/MEDIUM/HIGH и SHADER_HINT_NICE_QUALITY были удалены. Если вы использовали эти определения в пользовательских шейдерах, рассмотрите возможность использования определений SHADER_API_MOBILE или SHADER_API_GLES для замены SHADER_QUALITY_LOW/MEDIUM/HIGH.

Обновление с URP 12 (Unity 2021.2)

Изменения в поведении ScriptableRenderer API

Unity теперь выдает ошибку, когда экземпляры ScriptableRendererFeature попытка доступа к целям отображения до того, как они будут выделены ScriptableRenderer class.

ScriptableRendererFeature имеет новую виртуальную функцию SetupRenderPasses которая вызывается, когда цели рендеринга выделены и готовы к использованию.

Если ваш код использует ScriptableRenderer.cameraColorTarget или ScriptableRenderer.cameraDepthTarget свойства внутри AddRenderPasses переопределение метода, вам следует перенести эту реализацию в ScriptableRendererFeature.SetupRenderPasses метод.

Вызовы метода ScriptableRenderer.EnqueuePass должны по-прежнему происходить в методе AddRenderPasses.

В следующем примере показано, как изменить код для использования нового API.

Код со старым API:

public override void AddRenderPasses(ScriptableRenderer renderer,
                                    ref RenderingData renderingData)
{
    // The target is used before allocation
    m_CustomPass.Setup(renderer.cameraColorTarget);
     // Letting the renderer know which passes are used before allocation
    renderer.EnqueuePass(m_ScriptablePass);
}

Код с новым API:

public override void AddRenderPasses(ScriptableRenderer renderer,
                                        ref RenderingData renderingData)
{
    // Letting the renderer know which passes are used before allocation
    renderer.EnqueuePass(m_ScriptablePass);
}

public override void SetupRenderPasses(ScriptableRenderer renderer,
                                          in RenderingData renderingData)
{
    // The target is used after allocation
    m_CustomPass.Setup(renderer.cameraColorTarget);
}

Универсальный рендер теперь использует систему RTHandle

Универсальный рендерер теперь использует система RTHandle для своих внутренних целей и во внутренних проходах.

Все виды использования RenderTargetHandle структуры помечены как устаревшие, и в будущем структура будет удалена.

Публичные интерфейсы ScriptableRenderer.cameraColorTarget и ScriptableRenderer.cameraDepthTarget отмечены как устаревшие. Заменить их на ScriptableRenderer.cameraColorTargetHandle и ScriptableRenderer.cameraDepthTargetHandle соответственно.

Цели RTHandle не используют метод CommandBuffer.GetTemporaryRT и сохраняются на протяжении большего количества кадров, чем структуры RenderTargetIdentifier. Вы не можете выделить цели RTHandle со свойствами GraphicsFormat и DepthBufferBits, установленными на любое значение, кроме 0. Свойства cameraDepthTarget должны быть отделены от свойств cameraColorTarget.

Следующие вспомогательные функции позволяют создавать и использовать временную цель отображения с системой RTHandle аналогично тому, как это делалось ранее с методом GetTemporaryRT:

  • RenderingUtils.ReAllocateIfNeeded

  • ShadowUtils.ShadowRTReAllocateIfNeeded

Если цель рендеринга не меняется в течение срока жизни приложения, используйте метод RTHandles.Alloc для выделения цели RTHandle. Этот метод эффективный, так как коду не нужно проверять, следует ли выделять цель рендеринга на каждом кадре.

Если целью рендеринга является текстура полного экрана, то есть ее разрешение соответствует разрешению экрана или составляет его часть, используйте коэффициент масштабирования, например Vector2D.one, для поддержки динамического масштабирования.

В следующем примере показано, как изменить код, используя RenderTargetHandle API, чтобы использовать новый API.

Код со старым API:

public class CustomPass : ScriptableRenderPass
{
    RenderTargetHandle m_Handle;
    // With the old API, RenderTargetIdentifier might combine color and depth
    RenderTargetIdentifier m_Destination;

    public CustomPass()
    {
        m_Handle.Init("_CustomPassHandle");
    }

    public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
    {
        var desc = renderingData.cameraData.cameraTargetDescriptor;
        cmd.GetTemporaryRT(m_Handle.id, desc, FilterMode.Point);
    }

    public override void OnCameraCleanup(CommandBuffer cmd)
    {
        cmd.ReleaseTemporaryRT(m_Handle.id);
    }

    public void Setup(RenderTargetIdentifier destination)
    {
        m_Destination = destination;
    }

    public override void Execute(ScriptableRenderContext context,
                                    ref RenderingData renderingData)
    {
        CommandBuffer cmd = CommandBufferPool.Get();
        // Set the same target for color and depth
        ScriptableRenderer.SetRenderTarget(cmd, m_Destination, m_Destination, clearFlag,
                                              clearColor);
        context.ExecuteCommandBuffer(cmd);
        CommandBufferPool.Release(cmd);
    }
}

Код с новым API:

public class CustomPass : ScriptableRenderPass
{
    RTHandle m_Handle;
    // Then using RTHandles, the color and the depth properties must be separate
    RTHandle m_DestinationColor;
    RTHandle m_DestinationDepth;

    void Dispose()
    {
        m_Handle?.Release();
    }

    public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
    {
        var desc = renderingData.cameraData.cameraTargetDescriptor;
        // Then using RTHandles, the color and the depth properties must be separate
        desc.depthBufferBits = 0;
        RenderingUtils.ReAllocateIfNeeded(ref m_Handle, desc, FilterMode.Point,
                                         TextureWrapMode.Clamp, name: "_CustomPassHandle");
    }

    public override void OnCameraCleanup(CommandBuffer cmd)
    {
        m_DestinationColor = null;
        m_DestinationDepth = null;
    }

    public void Setup(RTHandle destinationColor, RTHandle destinationDepth)
    {
        m_DestinationColor = destinationColor;
        m_DestinationDepth = destinationDepth;
    }

    public override void Execute(ScriptableRenderContext context,
                                    ref RenderingData renderingData)
    {
        CommandBuffer cmd = CommandBufferPool.Get();
        CoreUtils.SetRenderTarget(cmd, m_DestinationColor, m_DestinationDepth,
                                              clearFlag, clearColor);
        context.ExecuteCommandBuffer(cmd);
        CommandBufferPool.Release(cmd);
    }
}

Обновление с URP 11.x.x

  • При открытии существующего проекта в Unity Editor, содержащего URP 12, Unity обновляет существующие ассеты Forward Renderer в ассеты Universal Renderer.

  • Ассет Universal Renderer содержит свойство Rendering Path, которое позволяет выбрать Путь Передового или Отложенного Рендирования.

  • Метод ClearFlag.Depth больше не очищает буфер Stencil. Используйте новый метод ClearFlag.Stencil.

  • URP 12 и более поздние версии реализуют Render Pipeline Converter. Эта функция заменяет функции обновления ассетов, которые ранее были доступны в Edit > Render Pipeline > Universal Render Pipeline > Upgrade…

Обновление с URP 10.0.x–10.2.x

  1. Названия файлов следующих шейдеров Shader Graph были переименованы. Новые имена файлов не содержат пробелов:
    Autodesk Interactive
    Autodesk Interactive Masked
    Autodesk Interactive Transparent

    Если ваш код использует метод Shader.Find() для поиска шейдеров, удалите пробелы из имен шейдеров, например, Shader.Find("AutodeskInteractive).

Обновление с URP 7.2.x и более поздних выпусков

  1. URP 12.x.x не поддерживает пакет Post-Processing Stack v2. Если ваш Project использует пакет Post-Processing Stack v2, сначала перенесите эффекты, использующие этот пакет.

DepthNormals Пропуск

Начиная с версии 10.0.x, URP может генерировать обычную текстуру под названием _CameraNormalsTexture. Чтобы отобразить эту текстуру в вашем пользовательском шейдере, добавьте Pass с именем DepthNormals. Для примера, проверьте реализацию в Lit.shader.

Экран пространства окружающей окклюзии (SSAO)

URP 10.0.x реализует эффект окклюзии окружающего пространства экрана (SSAO).

Если вы собираетесь использовать эффект SSAO с вашими пользовательскими шейдерами, рассмотрите следующие объекты, связанные с SSAO:

  • Ключевое слово _SCREEN_SPACE_OCCLUSION.

  • Input.hlsl содержит новую декларацию float2 normalizedScreenSpaceUV в 2000 году InputData struct.

  • Lighting.hlsl содержит AmbientOcclusionFactor структура с переменными для расчёта непрямого и прямого затенения:

    struct AmbientOcclusionFactor
    {
        half indirectAmbientOcclusion;
        half directAmbientOcclusion;
    };
    
  • Lighting.hlsl содержит следующую функцию для семплирования текстуры SSAO:

    half SampleAmbientOcclusion(float2 normalizedScreenSpaceUV)
    
  • Lighting.hlsl содержит следующую функцию:

    AmbientOcclusionFactor GetScreenSpaceAmbientOcclusion(float2
    normalizedScreenSpaceUV)
    

Чтобы поддержать SSAO в пользовательском шейдере, добавьте DepthNormals Pass и _SCREEN_SPACE_OCCLUSION ключевое слово в шейдер. Например, проверьте Lit.shader.

Если ваш пользовательский шейдер реализует пользовательские функции освещения, используйте функцию GetScreenSpaceAmbientOcclusion(float2 normalizedScreenSpaceUV) для получения значения AmbientOcclusionFactor для расчетов освещения.

Нормальный смещение тени

В 11.0.x формула, используемая для применения Shadow Normal Bias, была немного изменена, чтобы лучше работать с точечным освещением. В результате, чтобы точно соответствовать контурам тени из предыдущих ревизий, параметр может быть скорректирован в некоторых сценах. Как правило, использование 1.4 вместо 1.0 для Направленного освещения обычно достаточно.

Промежуточная текстура

В предыдущих версиях URP, URP выполнял рендеринг через промежуточный рендер, если рендер имел какие-либо активные функции рендера. На некоторых платформах это имело значительные последствия для производительности. В этом выпуске URP решает эту проблему следующим образом: URP ожидает, что функции рендера объявляют свои входы с помощью метода ScriptableRenderPass.ConfigureInput. Метод предоставляет информацию, которую URP использует для автоматического определения необходимости рендеринга через промежуточную текстуру.

Для целей совместимости в Универсальном Рендерере появилась новая характеристика Промежуточная Текстура. Если вы выберете Всегда в характеристике, URP будет использовать промежуточную текстуру. Выбор Авто включает новое поведение. Используйте параметр Всегда только в том случае, если Функция Рендерера не объявляет свои входы с помощью метода ScriptableRenderPass.ConfigureInput.

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

Обновление с URP 7.0.x–7.1.x

  1. Сначала обновите до URP 7.2.0. См. Обновление до версии 7.2.0 Universal Render Pipeline.

  2. URP 8.x.x не поддерживает пакет Post-Processing Stack v2. Если ваш Project использует пакет Post-Processing Stack v2, сначала перенесите эффекты, использующие этот пакет.

Обновление с LWRP на 12.x.x

  • Нет прямого пути обновления от LWRP до URP 12.x.x. Выполните шаги для обновления LWRP до URP 11.x.x сначала, а затем обновите от URP 11.x.x до URP 12.x.x.