Однопроходный стереофонический рендеринг — это функция приложений виртуальной реальности для ПК и Playstation 4. Он одновременно отображает изображения для левого и правого глаза в одну упакованную Render TextureСпециальный тип текстуры, который создается и обновляется. во время выполнения. Чтобы использовать их, сначала создайте новую текстуру рендеринга и назначьте одну из ваших камер для рендеринга в нее. Затем вы можете использовать Render Texture в материале, как обычную текстуру. Подробнее
См. в Словарь, который в два раза шире одного текстура глаз. Unity визуализирует СценуСцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
Просмотреть в Словарь дважды, используя 2 вызова отрисовки для каждого GameObjectФундаментальный объект в сценах Unity, который может представлять персонажей, реквизит, декорации, камеры, путевые точки и многое другое. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
См. в Словарь, в котором есть компонент Renderer, однако он только перебирает График сцены один раз при рендеринге как для левого, так и для правого глаза. Во время однопроходного стереорендеринга оба глаза разделяют работу, необходимую для отбраковки и расчета теней. Также меньше переключателей изменения состояния графических команд, потому что графический процессор отображает каждый игровой объект в стиле пинг-понга (чередует визуализацию объектов между глазами).
Однопроходный стереорендеринг позволяет графическому процессору совместно использовать отсечение для обоих глаз. Графическому процессору нужно только один раз перебрать все игровые объекты в сцене для целей отбраковки, а затем визуализировать игровые объекты, пережившие процесс отбраковки.
На сравнительных изображениях ниже показана разница между обычным рендерингом VR и рендерингом Single Pass Stereo.
Обычный рендеринг VR:
Однопроходный стереофонический VR-рендеринг:
Чтобы включить эту функцию, откройте настройки Player (меню: Правка > Настройки проектаБольшой набор настроек, которые позволяют настроить поведение физики, звука, сети, графики, ввода и многих других областей вашего проекта. Подробнее
См. Словарь, затем выберите категорию Игрок ). Затем перейдите на панель Настройки XR, убедитесь, что установлен флажок Поддерживается виртуальная реальность, и выберите параметр Single Pass в разделе Stereo. Раскрывающийся список Метод визуализации.
Встроенные функции рендеринга Unity и стандартные ресурсы поддерживают эту функцию. Однако настраиваемые шейдерыПрограмма, работающая на графическом процессоре. Подробнее
См. в Словарь и шейдеры, загруженные из класса Магазин ресурсовРасширяющаяся библиотека бесплатных и коммерческих ресурсов, созданная Unity и членами сообщества. Предлагает широкий спектр ресурсов, от текстур, моделей и анимации до целых примеров проектов, руководств и расширений редактора. Подробнее
См. в Словарь, возможно, потребуется изменить (например, может потребоваться масштабирование и смещение координат экранного пространства для доступа к соответствующей половине упакованной текстуры рендеринга), чтобы добавить поддержку однопроходного стереорендеринга.
Добавление поддержки однопроходного стереорендеринга в шейдеры
Существующие вспомогательные методы в UnityCG.cginc
поддерживают однопроходный стереорендеринг. Является ли ваше приложение XRОбщий термин, охватывающий приложения виртуальной реальности (VR), дополненной реальности (AR) и смешанной реальности (MR). . Устройства, поддерживающие эти формы интерактивных приложений, можно назвать устройствами XR. Подробнее
Смотреть в Словарь вам все равно нужно выполнить преобразования на вершинах. Например, при создании приложения любого типа вершины попадают в вершинный шейдерпрограмму, которая запускается на каждой вершине 3D-модели. когда модель визуализируется. Подробнее
Просмотр в Словарь в пространстве модели и выход в пространстве отсечения. Вершинный шейдер должен выводить координаты вершин пространства отсечения. Набор вершин, затронутых шейдером, обычно начинается в пространстве модели до того, как вершинный шейдер преобразует их в пространство отсечения. Однако для того, чтобы эти вершины попали в пространство отсечения, вершинный шейдер сначала преобразует их в мировое пространство, а затем в порт просмотра видимая пользователем область приложения на экране.
См. в разделе Словарь.
В случае XR существует несколько матриц просмотра: по одной для левого и правого глаза. Вы можете использовать встроенный метод UnityWorldToClipPos
, чтобы гарантировать, что Unity учитывает, требует ли расчет обработки нескольких матриц представления. Если вы используете метод UnityWorldToClipPos
, шейдер автоматически правильно выполняет вычисление преобразования, независимо от платформы, на которой работает ваше приложение.
UnityCG.cginc
также содержит следующие вспомогательные методы, помогающие создавать стереоскопические шейдеры:
Свойства | Параметры | Описание |
---|---|---|
UnityStereoScreenSpaceUVAdjust(uv, sb) |
uv : Координаты текстуры UV. Либо float2 для стандартного UV, либо float4 для упакованной пары из двух UV.sb : float4, содержащий 2D-масштаб и 2D-смещение, которые шейдер применяет к UV, с масштабом по xy и смещением по zw. |
Если определен UNITY_SINGLE_PASS_STEREO , возвращается результат применения масштаба и смещения в sb к координатам текстуры в uv. В противном случае это возвращает координаты текстуры без изменений. Используйте это, чтобы применить масштаб и смещение для каждого глаза только в режиме рендеринга Single Pass Stereo. |
UnityStereoTransformScreenSpaceTex(uv) |
uv :Координаты текстуры UV. Либо float2 для стандартного UV, либо float4 для упакованной пары из двух UV. |
Если определен UNITY_SINGLE_PASS_STEREO , возвращается результат применения масштаба и смещения текущего глаза к координатам текстуры в uv. В противном случае это возвращает координаты текстуры без изменений. |
UnityStereoClamp(uv, sb) |
uv : Координаты текстуры UV. Либо float2 для стандартного UV, либо float4 для упакованной пары из двух UV. sb : float4, содержащий 2D-масштаб и 2D-смещение, которые шейдер применяет к UV, с масштабом по xy и смещением по zw. |
Если определено UNITY_SINGLE_PASS_STEREO , это возвращает результат применения зажима к значению x, используя ширину и смещение, предоставленные sb, к координатам текстуры в uv . В противном случае возвращает координаты текстуры без изменений. Используйте это, чтобы применить фиксацию для каждого глаза в режиме рендеринга Single Pass Stereo, чтобы избежать цветового смешивания между глазами. |
Шейдеры предоставляют встроенную постоянную переменную «unity_StereoEyeIndex», чтобы Unity могла выполнять вычисления, зависящие от глаза. Значение unity_StereoEyeIndex
равно 0 для левого глаза и 1 для правого глаза.
Вот пример из UnityCG.cginc
, демонстрирующий, как можно использовать unity_StereoEyeIndex
для изменения координат экранного пространства: р>
float2 TransformStereoScreenSpaceTex(float2 uv, float w)
{
float4 scaleOffset = unity_StereoScaleOffset[unity_StereoEyeIndex];
return uv.xy * scaleOffset.xy + scaleOffset.zw * w;
}
В большинстве случаев изменять шейдеры не требуется. Однако бывают ситуации, когда вам может понадобиться сэмплировать моноскопическую текстуру как источник для однопроходного стереорендеринга (например, если вы создаете полноэкранный эффект зернистости пленки или шума, где исходное изображение должно быть одинаковым для обоих глаз, а не упакованным в стереоскопическое изображение). В таких ситуациях используйте ComputeNonStereoScreenPos()
вместо ComputeScreenPos()
для вычисления местоположений из полной исходной текстуры.
Эффекты постобработки
Эффекты постобработки требуют дополнительной работы для поддержки однопроходного стереорендеринга. Каждая постобработкаПроцесс, улучшающий внешний вид продукта путем применения фильтров и эффектов до того, как изображение появится на экране. Вы можете использовать эффекты постобработки для имитации физических свойств камеры и пленки, например Bloom и Depth of Field. Подробнее
См. Словарь. Эффект запускается один раз на упакованной текстуре рендеринга (которая содержит как для левого, так и для правого глаза), но все команды отрисовки, которые выполняются во время постобработки, применяются дважды: один раз к половине целевой визуализации текстуры для левого глаза и один раз к половине правого глаза.
Эффекты постобработки не определяют автоматически однопроходный стереорендеринг, поэтому вам необходимо настроить любые чтения упакованных текстур стереорендеринга так, чтобы они читались только с правильной стороны для визуализируемого глаза. Есть два способа сделать это в зависимости от того, как обрабатывается ваш эффект постобработки:
- Использование Graphics.Blit()
- Рисование на основе сетки
Без вышеупомянутых настроек каждая команда рисования считывает всю исходную текстуру рендеринга (содержащую как левый, так и правый глаз) и выводит всю пару изображений как для левой, так и для правой стороны выходного рендеринга. Текстура, приводящая к некорректному дублированию исходного изображения в каждом глазу.
Это происходит при использовании Graphics.Blit
или полноэкранного полигона с текстурной картой для отрисовки каждого эффекта постобработки . Оба метода ссылаются на весь результат предыдущего эффекта постобработки в цепочке. Когда речь идет об области упакованной стереотекстуры рендеринга, они ссылаются на всю упакованную текстуру рендеринга, а не только на соответствующую ее половину.
Графика.Blit()
Эффекты постобработки, визуализированные с помощью Blit()
, не ссылаются автоматически на правильную часть упакованных стереотекстур рендеринга. По умолчанию они относятся ко всей текстуре. Это неправильно растягивает эффект постобработки на оба глаза.
Для однопроходного стереофонического рендеринга с использованием Blit()
сэмплеры текстур в шейдерах имеют дополнительную автоматически вычисляемую переменную, которая ссылается на правильную половину упакованной стереотекстуры рендеринга в зависимости от на нарисованном глазу. Переменная содержит значения масштаба и смещения, которые позволяют вам преобразовать ваши целевые координаты в правильное местоположение.
Чтобы получить доступ к этой переменной, объявите half4
в своем шейдере с тем же именем, что и ваш сэмплер, и добавьте суффикс _ST
(см. ниже пример кода). Чтобы настроить UV-координаты, передайте переменную _ST
в scaleAndOffset
и используйте UnityStereoScreenSpaceUVAdjust(uv, масштаб и смещение)
. Этот метод ничего не компилирует в сборках без однопроходного стерео, а это означает, что шейдеры, модифицированные для поддержки этого режима, по-прежнему совместимы со сборками без однопроходного стерео.
В следующих примерах показано, что необходимо изменить в коде фрагментного шейдера для поддержки однопроходного стереорендеринга.
Без стереорендеринга:
uniform sampler2D _MainTex;
fixed4 frag (v2f_img i) : SV_Target
{
fixed4 myTex = tex2D(_MainTex, i.uv);
...
}
Со стереорендерингом:
uniform sampler2D _MainTex;
half4 _MainTex_ST;
fixed4 frag (v2f_img i) : SV_Target
{
fixed4 myTex = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST));
...
}
Рисование на основе сетки
Визуализация эффектов постобработки с использованием сеток (например, рисование четырехугольника в непосредственном режиме с помощью графического API низкого уровня) также требует корректировки UV-координаты целевой текстуры при рендеринге каждого глаза. Чтобы настроить свои координаты в этих обстоятельствах, используйте UnityStereoTransformScreenSpaceTex(uv)
. Этот метод правильно настраивается для упакованных стереофонических текстур рендеринга в режиме рендеринга Single Pass Stereo и автоматически компилируется для неупакованных текстур рендеринга, если вы отключили режим рендеринга Single Pass Stereo. Однако если вы собираетесь использовать шейдер как для упакованных, так и для неупакованных текстур рендеринга в одном и том же режиме, вам потребуется два отдельных шейдера.
Эффекты экранного пространства
Эффекты экранного пространства — это визуальные эффекты, накладываемые на предварительно обработанное изображение. Примеры эффектов экранного пространства включают затенение окружающей средыметод, свет (свет, исходящий не с определенного направления) может попасть в точку на поверхности.
См. в Словарь, глубина резкостиЭффект постобработки, имитирующий свойства фокусировки объектива камеры. Подробнее
См. в Словарь и bloomЭффект постобработки, используемый для воспроизведения артефакта изображения реальных камер. Этот эффект создает полосы света, простирающиеся от границ ярких областей изображения, создавая иллюзию чрезвычайно яркого света, подавляющего камеру или захватывающего взглядом сцену.
См. в Словарь.
Например, представьте себе эффект экранного пространства, который требует, чтобы изображение было нарисовано поверх экрана (возможно, вы рисуете грязь, разбрызганную по экрану). Вместо того, чтобы применять эффект ко всему выходному дисплею, что растянуло бы изображение грязи на оба глаза, вам нужно применить его дважды: по одному разу для каждого глаза. В подобных случаях вам необходимо преобразовать использование координат текстуры, которые ссылаются на всю упакованную текстуру рендеринга, на координаты, которые ссылаются на каждый глаз.
В следующих примерах кода показан Шейдер поверхностиупрощенный способ написания шейдеров для встроенного конвейера рендеринга. Подробнее
См. в Словарь, который повторяет входную Текстуру (называемую _Detail) 8 x 6 раз по выходному изображению. Во втором примере шейдер преобразует координаты пункта назначения в однопроходном стереорежиме, чтобы они относились к той части выходной текстуры, которая представляет визуализируемый в данный момент глаз.
Пример 1: Детализация текстуры без поддержки однопроходного стерео
void surf(Input IN, inout SurfaceOutput o)
{
o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
float2 screenUV = IN.screenPos.xy / IN.screenPos.w;
screenUV *= float2(8,6);
o.Albedo *= tex2D(_Detail, screenUV).rgb * 2;
}
Пример 2: Детализация текстуры с поддержкой однопроходного стерео
void surf(Input IN, inout SurfaceOutput o)
{
o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
float2 screenUV = IN.screenPos.xy / IN.screenPos.w;
#if UNITY_SINGLE_PASS_STEREO
// If Single-Pass Stereo mode is active, transform the
// coordinates to get the correct output UV for the current eye.
float4 scaleOffset = unity_StereoScaleOffset[unity_StereoEyeIndex];
screenUV = (screenUV - scaleOffset.zw) / scaleOffset.xy;
#endif
screenUV *= float2(8,6);
o.Albedo *= tex2D(_Detail, screenUV).rgb * 2;
}