Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Однопроходный инстансный рендеринг

При рендеринге Single Pass Instanced (также известном как Stereo Instancing) графический процессор выполняет один проход рендеринга, заменяя каждый вызов отрисовки вызовом отрисовки с экземпляром. Это значительно снижает использование ЦП и немного снижает использование ГП из-за когерентности кэша между двумя отрисовками. звонки. Это значительно снижает энергопотребление вашего приложения.

Поддерживаемые платформы

  • Игровая приставка PlayStation
  • Oculus Rift (DirectX 11)
  • ХолоЛенс
  • Волшебный прыжок
  • Устройства Android, поддерживающие расширение Multiview
  • Для DirextX на настольном ПК графический процессор должен поддерживать Direct3D 11 и расширение VPAndRTArrayIndexFromAnyShaderFeedingRasterizer.
  • Для использования OpenGL на настольных компьютерах графический процессор должен поддерживать одно из следующих расширений:
    • GL_NV_viewport_array2
    • GL_AMD_vertex_shader_layer
    • GL_ARB_shader_viewport_layer_array

Примечание. Unity не поддерживает создание однопроходных стереофонических экземпляров в устаревшем конвейере рендерингаA ряд операций, которые берут содержимое сцены и отображают его на экране. Unity позволяет вам выбирать из готовых конвейеров рендеринга или писать свои собственные. Подробнее
См. Словарь
при использовании отложенного рендеринга.

Чтобы включить эту функцию, откройте настройки Player (выберите Редактировать > Настройки проектаБольшой набор настроек, которые позволяют настроить поведение физики, звука, сети, графики, ввода и многих других областей вашего проекта. Дополнительно информация
См. Словарь
, затем выберите категорию Игрок ). В настройках Player перейдите на панель Настройки XR внизу, установите флажок Поддерживается виртуальная реальность, затем выберите Single Pass. Экземпляр (предварительная версия) в раскрывающемся меню Метод стереорендеринга.

На панели настроек XR установите для метода стереорендеринга значение Single Pass Instanced (предварительная версия).
На панели настроек XR установите для метода стереорендеринга значение Single Pass Instanced (предварительная версия).

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

Пользовательские шейдеры

Прежде чем следовать приведенным ниже инструкциям, обновите пользовательские шейдеры, чтобы использовать создание экземпляров (см. Управление экземплярами графического процессора).

Затем вам нужно внести два дополнительных изменения в последнюю стадию шейдера, используемую перед шейдером фрагмента (Вертекс/Оболочка/Домен/Геометрия) для любого из ваших пользовательских шейдеров.

Для каждого пользовательского шейдера, который вы хотите поддерживать с однопроходным созданием экземпляров, выполните следующие действия:

Шаг 1. Добавьте UNITY_VERTEX_INPUT_INSTANCE_ID в структуру данных приложения.

Пример:

struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID //Insert };

Шаг 2. Добавьте UNITY_VERTEX_OUTPUT_STEREO в выходную структуру v2f.

Пример:

struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; UNITY_VERTEX_OUTPUT_STEREO //Insert };

Шаг 3. Добавьте макрос UNITY_SETUP_INSTANCE_ID() в начало основной вертикали. метод, за которым следует вызов UNITY_INITIALIZE_OUTPUT(v2f, o) и UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO().

UNITY_SETUP_INSTANCE_ID() вычисляет и устанавливает встроенный unity_StereoEyeIndex и unity_InstanceID переменные шейдера в правильные значения в зависимости от того, какой глаз в данный момент обрабатывает графический процессор.

UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO сообщает графическому процессору, для какого глаза в массиве текстур он должен выполнять визуализацию, на основе значения unity_StereoEyeIndex. Этот макрос также передает значение unity_StereoEyeIndex из вершинного шейдерапрограммы, которая выполняется для каждой вершины 3D-модели во время рендеринга модели. Подробнее
См. в Словарь
, чтобы он был доступен во фрагментном шейдере, только если UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX вызывается в методе фрагментного шейдера frag.

UNITY_INITALIZE_OUTPUT(v2f,o) инициализирует все значения v2f равными 0.

Пример:

v2f vert (appdata v) { v2f o; UNITY_SETUP_INSTANCE_ID(v); //Insert UNITY_INITIALIZE_OUTPUT(v2f, o); //Insert UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); //Insert o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; }

Шейдеры постобработки

Если вы хотите, чтобы ваша постобработкапроцесс, который улучшает визуальные эффекты продукта, применяя фильтры и эффекты до того, как изображение появится на экране . Вы можете использовать эффекты постобработки для имитации физических свойств камеры и пленки, например Bloom и Depth of Field. Дополнительная информация
См. в шейдерах Словарь
для поддержки однопроходного экземпляра , выполните шаги в разделе Пользовательские шейдеры, а также шаги, описанные ниже. Вы можете скачать все базовые шейдеры Unity скриптыфрагмент кода, позволяющий создавать собственные компоненты, запускать игровые события, изменять компоненты свойства с течением времени и реагировать на пользовательский ввод любым удобным для вас способом. Подробнее
См. в Словарь
из веб-сайт Unity.

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

Шаг 1. Добавьте макрос UNITY_DECLARE_SCREENSPACE_TEXTURE(tex) вне метода frag (см. пример размещения ниже) в сценарии шейдера, чтобы при использовании определенного метода стереорендеринга графический процессор использовал соответствующий образец текстуры. Например, если вы используете многопроходный рендеринг, графический процессор использует 2D-сэмплер текстуры. Для однопроходного экземпляра или рендеринга с несколькими представлениями образец текстуры представляет собой массив текстур.

Шаг 2. Добавьте UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i) в начало метода frag фрагментного шейдера (см. пример размещения ниже). Вам нужно добавить этот макрос только в том случае, если вы хотите использовать встроенную переменную шейдера unity_StereoEyeIndex, чтобы узнать, для какого глаза выполняется рендеринг GPU. Это полезно при тестировании эффектов постобработки.

Шаг 3. Используйте макрос UNITY_SAMPLE_SCREENSPACE_TEXTURE() при выборке 2D-текстур (см. пример размещения ниже). Стандартные шейдеры используют задний буфер на основе 2D-текстуры для выборки текстур. Single Pass Stereo Instancing не использует этот тип заднего буфера, поэтому, если вы не укажете другой метод для сэмплирования 2D-текстуры, ваш шейдер не будет отображаться правильно. Чтобы предотвратить проблемы с рендерингом, макрос UNITY_SAMPLE_SCREENSPACE_TEXTURE() определяет, какой стерео путь рендеринга Метод, используемый конвейером рендеринга для рендеринга графики. Выбор другого пути рендеринга влияет на расчет освещения и затенения. Некоторые пути рендеринга больше подходят для разных платформ и оборудования, чем другие. Подробнее
Посмотрите в Словарь
, который вы используете, а затем автоматически сэмплирует текстуру в правильном порядке. . См. документацию Unity в HLSLSupport.cginc, чтобы узнать больше об аналогичных макросах, используемых для текстур глубины и карт теней в экранном пространстве.

Пример:

UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex); //Insert fixed4 frag (v2f i) : SV_Target { UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); //Insert fixed4 col = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv); //Insert // just invert the colors col = 1 - col; return col; }

Полный образец кода шейдера

Ниже приведен простой пример шейдера эффекта изображения шаблона со всеми ранее упомянутыми изменениями, примененными для поддержки однопроходного создания экземпляров. Дополнения к коду шейдера отмечены комментарием (//Insert).

struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID //Insert }; //v2f output struct struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; UNITY_VERTEX_OUTPUT_STEREO //Insert }; v2f vert (appdata v) { v2f o; UNITY_SETUP_INSTANCE_ID(v); //Insert UNITY_INITIALIZE_OUTPUT(v2f, o); //Insert UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); //Insert o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex); //Insert fixed4 frag (v2f i) : SV_Target { UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); //Insert fixed4 col = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv); //Insert // invert the colors col = 1 - col; return col; }

Процедурная геометрия

При использовании Graphics.DrawProceduralIndirect() и CommandBuffer.DrawProceduralIndirect( ) для отрисовки полностью процедурной геометрии на графическом процессоре, важно отметить, что оба метода получают свои аргументы из вычислительного буфера. Это означает, что трудно увеличить количество экземпляров во время выполнения. Чтобы увеличить количество экземпляров, вам нужно вручную удвоить количество экземпляров, содержащихся в ваших вычислительных буферах.

Отладка шейдера

Следующий код шейдера визуализирует GameObjectосновной объект в сценах Unity, который может представлять персонажей, реквизит, декорации, камеры. , путевые точки и многое другое. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
Увидеть в Словарь
зеленый цвет для левого глаза пользователя и красный цвет для правого глаза . Этот шейдер удобен для отладки стереорендеринга, поскольку позволяет убедиться, что вся стереографика работает и работает правильно.

Shader "XR/StereoEyeIndexColor" { Properties { _LeftEyeColor("Left Eye Color", COLOR) = (0,1,0,1) _RightEyeColor("Right Eye Color", COLOR) = (1,0,0,1) } SubShader { Tags { "RenderType" = "Opaque" } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag float4 _LeftEyeColor; float4 _RightEyeColor; #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; UNITY_VERTEX_INPUT_INSTANCE_ID }; struct v2f { float4 vertex : SV_POSITION; UNITY_VERTEX_INPUT_INSTANCE_ID UNITY_VERTEX_OUTPUT_STEREO }; v2f vert (appdata v) { v2f o; UNITY_SETUP_INSTANCE_ID(v); UNITY_INITIALIZE_OUTPUT(v2f, o); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); o.vertex = UnityObjectToClipPos(v.vertex); return o; } fixed4 frag (v2f i) : SV_Target { UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); return lerp(_LeftEyeColor, _RightEyeColor, unity_StereoEyeIndex); } ENDCG } } }
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3