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

Графические уровни во Встроенном Render Pipeline

В течение Built-in Render Pipeline, вы можете использовать графические слои для применения различных графических настроек, когда ваше приложение работает на оборудовании с различными возможностями. Вы можете использовать UnityВстроенный настройки уровня для настройки общих параметров, или вы можете определить настраиваемое поведение в собственном коде шейдера или C# код.

Примечание: Эта функция поддерживается только в Built-in Render Pipeline. В других конвейерах рендеринга Unity все еще проверяет оборудование при запуске и сохраняет его значение в Graphics.activeTier; однако значение этого поля не имеет никакого значения, и Unity не выполняет никаких других операций, связанных с графическими уровнями.

Обзор графических уровней

Когда Unity впервые загружает ваше приложение, оно изучает оборудование и графику API и определяет, какому уровню графики соответствует текущая среда.

Графические уровни:

Значение Аппаратное обеспечение Соответствующие GraphicsTier значение перечисления Соответствующее ключевое слово шейдера
1 iOS: iPhones до iPhone 5S (не включая 5S, но включая 5C), iPods до и включая 5-е поколение, iPads до 4-го поколения, iPad мини первое поколение
Настольные: DirectX 9
XR: HoloLens
Tier1 UNITY_HARDWARE_TIER1
2 Android: устройства, поддерживающие OpenGL ES 3, устройства, поддерживающие Vulkan
iOS: iPhones начиная с iPhone 5S, iPad Air, iPad mini 2 поколения, iPod 6 поколения, AppleTV
WebGL: все устройства
Tier2 UNITY_HARDWARE_TIER2
3 Настольный: OpenGL, Metal, Vulkan, DirectX 11+ Tier3 UNITY_HARDWARE_TIER3

Графические слои и варианты шейдеров

В течение Built-in Render Pipeline, Unity может генерировать варианты шейдеров которые соответствуют графическим уровням.

Примечание: Эти варианты уровневых шейдеров работают иначе, чем обычные варианты шейдеров. Во время выполнения, когда Unity загружает объект Shader в память CPU, он загружает только варианты для активного уровня; он не загружает варианты для других уровней. Это помогает уменьшить влияние вариантов уровней во время выполнения.

Чтобы создать варианты шейдеров уровней, Unity добавляет этот набор шейдер ключевые слова ко всем графическим шейдерам:

UNITY_HARDWARE_TIER1
UNITY_HARDWARE_TIER2
UNITY_HARDWARE_TIER3

Вы можете использовать эти ключевые слова в вашем коде HLSL для написания условного поведения для аппаратных средств более низкого или более высокого уровня, так же, как и для любых ключевых слов для шейдеров. Например:

#if UNITY_HARDWARE_TIER1
// Put code for tier 1 devices here
#else
// Put code for other devices here
#endif

Дополнительные сведения о работе с ключевыми словами шейдера в коде HLSL см. в Объявление и использование ключевых слов шейдера в HLSL.

Unity автоматически генерирует варианты уровневых шейдеров на основе настроек уровней для текущей цели сборки, например:

  • Если все настройки для всех уровней одинаковы, Unity не генерирует ни одного варианта шейдера уровня.
  • Если какие-либо настройки для разных уровней каким-либо образом отличаются, Unity генерирует все варианты шейдеров уровней.

После создания всех вариантов уровневых шейдеров, Unity идентифицирует и дедупликирует идентичные варианты уровневых шейдеров. Это означает, что если настройки для двух уровней идентичны (например, если уровень 1 отличается, но уровни 2 и 3 идентичны друг другу), то эти варианты не увеличивают размер файла приложения, и способ, которым Unity загружает варианты уровней, означает, что они не влияют на время загрузки или использование памяти выполнения. Однако это все равно приводит к избыточной работе компиляции.

Если вы хотите использовать разные настройки для разных уровней, но вы также знаете, что это приведет к избыточной работе — например, если вы знаете, что ваше приложение будет работать только на устройствах уровня 1 и уровня 2 — вы можете использовать скрипт для удаления ненужных вариантов уровня из компиляции, так же как и для любых других вариантов. Дополнительную информацию см. в Отсечение вариантов шейдеров.

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

Чтобы вручную заставить Unity генерировать варианты уровневых шейдеров для данного шейдера, используйте директиву препроцессора #pragma hardware_tier_variants в коде HLSL и укажите графику APIs, для которой вы хотите генерировать варианты по уровням:

#pragma hardware_tier_variants gles3

Для списка действительных графиков API имена, которые можно использовать с этой директивой, см. Графика таргетирования APIs. Общая информация #pragma директивы, см. директивы.