Если ориентация фреймбуфера вашего приложения не соответствует исходной ориентации дисплея (книжная ориентация для большинства устройств), Android необходимо применять дополнительный поворот каждый раз, когда на экране появляется визуализированный кадр. Эта дополнительная ротация может привести к снижению производительности в зависимости от аппаратных возможностей устройства.
В большинстве случаев вы можете применить этот поворот во время рендеринга с очень небольшими затратами. Для этого перейдите к Настройки проигрывателяНастройки, которые позволяют установить различные варианты для конкретного игрока для финальной игры, созданной Unity. Подробнее
См. в Словарь (см. также: PlayerSettings.vulkanEnablePreTransform
) и включите параметр Применять поворот экрана во время рендеринга.
Примечание. Поворот применяется только тогда, когда Unity выполняет рендеринг напрямую в резервный буфер. Он не действует при рендеринге в Render TextureСпециальный тип текстуры, который создается и обновляется во время выполнения. Чтобы использовать их, сначала создайте новую текстуру рендеринга и назначьте одну из ваших камер для рендеринга в нее. Затем вы можете использовать Render Texture в материале, как обычную текстуру. Подробнее
См. в Словарь.
Чтобы применить поворот, Unity изменяет матрицу проекции (UNITY_MATRIX_MVP, UNITY_MATRIX_P). Это означает, что само вращение применяется в вершинном шейдерепрограмме, работающей на графическом процессоре. Подробнее
См. в Словарь.
Настройка preTransform
не влияет на поведение C# API Unity. Например, значение Screen.width
не меняется из-за настройки preTransform
. То же самое относится к окнам просмотравидимой пользователем области приложения на экране.
См. в Словарь и ножницах. Unity корректирует их по мере необходимости, а также обрабатывает операции обратного чтения из резервного буфера, такие как Grab Pass, ReadPixels или Screenshot.
Unity предоставляет служебные макросы для обработки особых случаев в шейдерах (дополнительную информацию см. в разделе Известные ограничения ниже).
Макрос UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION определен, только если выполняются все следующие условия (в противном случае он не определен):
preTransform
включен в настройках проигрывателя- выбрана платформа Android
- графический API настроен на Vulkan
UNITY_DISPLAY_ORIENTATION_PRETRANSFORM – это константа, для которой задан текущий поворот preTransform
. Его значение может быть одним из следующих:
- UNITY_DISPLAY_ORIENTATION_0
- UNITY_DISPLAY_ORIENTATION_90
- UNITY_DISPLAY_ORIENTATION_180
- UNITY_DISPLAY_ORIENTATION_270.
Если значение UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION не определено или при рендеринге в визуализированную текстуру значение UNITY_DISPLAY_ORIENTATION_PRETRANSFORM равно UNITY_DISPLAY_ORIENTATION_0.
UNITY_DISPLAY_ORIENTATION_PRETRANSFORM преобразуется в константу специализации Vulkan, что позволяет эффективно использовать ее в операторах if
или switch
. р>
Известные ограничения
В следующих случаях, вероятно, для включения preTransform потребуются дополнительные изменения в вашем проекте Unity, прежде чем вы сможете его использовать:
- Шейдеры, не использующие матрицу проекции Unity
- Шейдеры, зависящие от текущего пикселянаименьшей единицы компьютерного изображения. Размер пикселя зависит от разрешения вашего экрана. Пиксельное освещение рассчитывается для каждого пикселя экрана. Подробнее
Посмотреть в позиции Словарь во фрагментном шейдере (SV_Position
) - Шейдеры, использующие производные экранного пространства (ddx, ddy)
- Возможно, потребуется изменить собственные подключаемые модули рендеринга, использующие образ цепи обмена Vulkan.
- Использование резервного буфера с Unity RenderPass API в настройке MRT вместе с другими текстурами рендеринга
Эти случаи применимы только при рендеринге непосредственно в резервный буфер.
Дополнительная литература
- Руководство по дизайну Vulkan на веб-сайте разработчиков Android.
- Эффективная обработка ориентации устройства в Vulkan с предварительной ротацией в блог разработчиков Android.
- Рекомендации Vulkan для мобильных устройств — Надлежащее использование вращения поверхности на веб-сайте сообщества разработчиков оружия.