Unity поддерживает однопроходный стереорендеринг для устройств Android, поддерживающих мультипросмотр. Multiview состоит из GL_OVR_multiview2 и GL_OVR_multiview_multisampled_render_to_texture расширения OpenGL ES. Эти расширения требуют, чтобы шейдеры использовали массив 2D-текстур, состоящий из двух срезов, по одному на каждый глаз. Это отличается от реализации однопроходного стереорендеринга Unity для ПК/PS4, в котором используется 2D-текстура двойной ширины. Это означает, что шейдерПрограмма, работающая на графическом процессоре. Подробнее
См. в Словарь, модификации для поддержки однопроходного стереорендеринга на Android отличаются от другие платформы.
Требования к коду шейдера
Чтобы использовать однопроходный стереорендеринг с пользовательскими шейдерами, может потребоваться включить дополнительный код шейдера. Вам не нужно включать дополнительный код, если ваши пользовательские шейдеры:
-
Шейдеры поверхностиУпрощенный способ написания шейдеров для встроенного конвейера рендеринга. Подробнее
См. в Словарь, в котором нет пользовательской обработки вершин. - Конвейерные шейдеры с фиксированными функциями.
Примечание. Эти изменения шейдера совместимы с многопроходным стереорендерингом.
Измените свои шейдеры
Если вы хотите использовать встроенную переменную шейдера unity_StereoEyeIndex
, чтобы узнать, для какого глаза выполняется рендеринг GPU, вы должны объявить UNITY_VERTEX_OUTPUT_STEREO
во всех имеющихся у вас выходных структурах этапа шейдера. Например:
struct v2f {
float2 uv : TEXCOOR0;
float4 vertex : SV_POSITION;
UNITY_VERTEX_OUTPUT_STEREO
};
Для инициализации выходных данных используйте UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO()
в вершинном шейдереПрограмма, которая запускается на каждой вершине 3D-модели во время рендеринга модели. Подробнее
См. в функции Словарь. Например:
v2f vert (appdata v)
{
v2f o;
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
Чтобы инициализировать unity_StereoEyeIndex
на последующих этапах, добавьте UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX()
в начале. Например:
fixed4 frag (v2f i) : SV_Target
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
Если ваши шейдеры используют другие этапы шейдеров, используйте макрос UNITY_TRANSFER_VERTEX_OUTPUT_STEREO()
, чтобы передать индекс глаза на последующие этапы.
Совет. Чтобы вычислить конечное положение объекта, рекомендуется использовать UnityObjectToClipPos(IN.vertex)
вместо mul(UNITY_MATRIX_MVP, IN.vertex)
.
Шейдеры постобработки
Необходимо обновить постобработкупроцесс, улучшающий внешний вид продукта за счет применения фильтров и эффектов до того, как изображение появится на экране. Вы можете использовать эффекты постобработки для имитации физических свойств камеры и пленки, например Bloom и Depth of Field. Дополнительная информация
См. в шейдерах Словарь, чтобы разобраться с текстурами глаз, являющимися 2D-текстурами. множество. Чтобы помочь в этом, Unity включает макрос UNITY_DECLARE_SCREENSPACE_TEXTURE()
. Чтобы текстуры работали как в многопроходном, так и в однопроходном режимах, оберните каждую текстуру в этот макрос. Кроме того, при сэмплировании текстуры используйте макрос UNITY_SAMPLE_SCREENSPACE_TEXTURE()
.
Этот макрос требует, чтобы вы вызывали UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX()
заранее в однопроходном режиме. Unity также включает аналогичные макросы для текстур глубины и карт теней экранного пространства. Вы можете увидеть полный список в нижней части HLSLSupport.cginc
.