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

Ориентация кадрового буфера

Если ориентация кадрового буфера вашего приложения не совпадает с ориентацией экрана устройства (портретная, для большинства устройств), Android поворачивает кадровый буфер приложения, чтобы соответствовать дисплею устройства каждый кадр. В зависимости от возможностей оборудования устройства, это дополнительное вращение может негативно повлиять на производительность. Если ваше приложение использует Vulkan Graphics API и устройство поддерживает Vulkan, Unity может применить это вращение во время рендеринга, что уменьшает влияние вращения на производительность. Это называется pre-rotation.

Использование предварительного вращения в Unity

Чтобы Unity применял предварительное вращение, вы можете использовать скрипт C# или Unity Editor:

  • Через C# скрипты: Установите PlayerSettings.vulkanEnablePreTransform на true.

  • Через Unity Editor:

  • Выберите Изменить > Project Настройки.

  • В окне настроек Project выберите вкладку Игрок, затем откройте Android Player Settings.

  • В разделе Другие настройки включите Применять вращение экрана во время рендеринга.

Как Unity применяет предварительное вращение

Unity применяет предварительное вращение, когда он рендируется непосредственно в обратный буфер устройства, а не когда он рендируется в Текстура рендеринга. Чтобы применить вращение, Unity изменяет матрицу проекции, которая влияет на UNITY_MATRIX_MVP и UNITY_MATRIX_P Встроенные переменные шейдераЭто означает, что Unity применяет вращение в вершинном шейдере.

Предварительный поворот не влияет на поведение API C# в Unity. Например, для получения ширины экрана по-прежнему можно использовать Screen.width. То же относится к областям просмотра и прямоугольникам отсечения. Unity при необходимости корректирует их, а также обрабатывает операции чтения из заднего буфера, такие как Grab Pass, ReadPixels и Screenshot.

Unity предоставляет макросы для обработки особых случаев в шейдерах (для более подробной информации см. раздел Ограничения ниже).

Макрос UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION определяется только в том случае, если выполнены все следующие условия (в противном случае он не определяется):

  • preTransform включено в Настройках Игрока
  • платформа установлена на Android
  • графика API установлена на Vulkan

UNITY_DISPLAY_ORIENTATION_PRETRANSFORM — константа, которая устанавливается на текущее вращение preTransform. Ее значение является одним из следующих:

  • UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_0
  • UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_90
  • UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_180
  • UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_270

Если UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION не определен, или при рендеринге в текстуру рендеринга, значение UNITY_DISPLAY_ORIENTATION_PRETRANSFORM будет UNITY_DISPLAY_ORIENTATION_0.

UNITY_DISPLAY_ORIENTATION_PRETRANSFORM преобразуется в константу специализации Vulkan, поэтому её можно эффективно использовать в операторах if и switch.

Ограничения

В следующих случаях включение preTransform может потребовать дополнительных изменений в Unity Project, прежде чем вы сможете использовать его:

  • Шейдеры, которые не используют матрицу проекции Unity
  • Шейдеры, которые зависят от текущего положения пикселя в шейдере фрагмента (SV_Position)
  • Шейдеры, использующие производные экранного пространства (ddx, ddy)
  • Настоящие плагины отображения, которые используют образ Vulkan swapchain, могут нуждаться в модификации
  • Использование backbuffer с Unity RenderPass API в MRT настройке вместе с другими текстурами рендеринга

Эти случаи применимы только при рендеринге непосредственно в backbuffer.

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

  • Vulkan Руководство по дизайну на сайте разработчика Android.
  • Vulkan Mobile Best Practice — Соответствующее использование вращения поверхности на сайте сообщества arm.