Существует два метода стереорендеринга для голографических устройств Windows (HoloLens); многопроходные и однопроходные экземпляры.
Многопроходный
Многопроходный рендеринг включает 2 полных прохода рендеринга (по одному для каждого глаза). Это создает почти вдвое большую нагрузку на ЦП по сравнению с однопроходным методом инстансного рендеринга. Однако этот метод является наиболее обратно совместимым и не требует никакого шейдерапрограммы, работающей на графическом процессоре. Подробнее
См. в разделе Словарь изменения.
Однопроходный экземпляр
При отрисовке экземпляра выполняется один проход рендеринга, при котором каждый вызов отрисовки заменяется вызовом отрисовки экземпляра. Это сильно снижает загрузку процессора. Кроме того, это немного снижает загрузку графического процессора из-за когерентности кеша между двумя вызовами отрисовки. В свою очередь энергопотребление вашего приложения будет намного ниже.
Чтобы включить эту функцию, откройте настройки Player (меню: Правка > Настройки проектаБольшой набор настроек, которые позволяют настроить поведение физики, звука, сети, графики, ввода и многих других областей вашего проекта. Подробнее
См. Словарь, затем выберите категорию Игрок ). Затем перейдите на панель Другие настройки, включите свойство Поддерживается виртуальная реальность, затем выберите Single Pass Instanced (самый быстрый) в разделе Stereo. раскрывающееся меню «Метод визуализации».
По умолчанию Unity использует более медленный параметр Многопроходный (Slow), так как у вас могут быть пользовательские шейдеры, для которых нет необходимого кода в ваших скриптахКусок кода, позволяющий создавать собственные Компоненты, запускать игровые события, изменять свойства Компонентов с течением времени и реагировать на действия пользователя любым удобным для вас способом. Подробнее
см. в Словарь.
Требования к сценарию шейдера
Все невстроенные шейдеры необходимо обновить для работы с созданием экземпляров. Прочтите эту документацию, чтобы узнать, как это делается: Инстанцирование GPU. Кроме того, вам нужно будет внести два дополнительных изменения в последнюю стадию шейдера, используемую перед фрагментным шейдером (Vertex/Hull/Domain/Geometry). Во-первых, вам нужно будет добавить UNITY_VERTEX_OUTPUT_STEREO
в выходную структуру. Во-вторых, вам нужно будет добавить UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO()
в основную функцию для этого этапа после вызова UNITY_SETUP_INSTANCE_ID()
.
Шейдеры постобработки
Вам потребуется добавить макрос UNITY_DECLARE_SCREENSPACE_TEXTURE(tex)
вокруг объявлений входных текстур, чтобы массивы 2D-текстур были объявлены правильно. Затем вы должны добавить вызов UNITY_SETUP_INSTANCE_ID()
в начале фрагментного шейдера. Наконец, вам нужно будет использовать макрос UNITY_SAMPLE_SCREENSPACE_TEXTURE()
при выборке этих текстур. См. HLSLSupport.cginc для получения дополнительной информации о других подобных макросах, текстурах глубины и картах теней экранного пространства.
Вот простой пример, в котором применяются все ранее упомянутые изменения к эффекту изображения шаблона:
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
UNITY_INSTANCE_ID
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
UNITY_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
v2f vert (appdata v)
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_TRANSFER_INSTANCE_ID(v, o);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex);
fixed4 frag (v2f i) : SV_Target
{
UNITY_SETUP_INSTANCE_ID(i);
fixed4 col = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv);
// just invert the colors
col = 1 - col;
return col;
}
Graphics.DrawProceduralIndirect()
и CommandBuffer.DrawProceduralIndirect()
получают все свои аргументы из вычислительного буфера, поэтому мы не может легко увеличить количество экземпляров. Поэтому вам придется вручную удвоить количество экземпляров, содержащихся в ваших вычислительных буферах.
Дополнительную информацию о коде шейдера см. на странице примеры вершинных и фрагментных шейдеров.