Unity 6.3
0 онлайн 72 гостей 3 в системе
Вход
Разработка платформы Шаг 65 из 387

Однопроходное стерео рендеринг для Android

Unity поддерживает однопроходное стерео рендеринг для Android устройств, поддерживающих мультивизуализацию. Мультивизуализация состоит из расширений GL_OVR_multiview2 и GL_OVR_multiview_multisampled_render_to_texture OpenGL ES. Эти расширения требуют, чтобы шейдеры использовали текстурный массив 2D, состоящий из двух слоев, по одному слою на глаз.

Требования к коду шейдера

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

  • Поверхностные шейдеры, которые не имеют пользовательской обработки вершин.
  • Конвейерные шейдеры с фиксированной функцией.

Примечание: Эти изменения шейдеров совместимы с многопроходным стерео-рендерингом.

Изменение шейдеров

Если вы хотите использовать встроенную в шейдер переменную 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() в функции вершинного шейдера. Например:

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).

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

Вы должны обновить шейдеры для последующей обработки текстур глаза, так как текстуры глаза являются массивом текстур 2D. Для этого Unity содержит макрос UNITY_DECLARE_SCREENSPACE_TEXTURE(). Чтобы текстуры работали как в многопроходном, так и в однопроходном режиме, оберните каждую текстуру в этот макрос. Кроме того, когда вы семплируете текстуру, используйте макрос UNITY_SAMPLE_SCREENSPACE_TEXTURE().

Этот макрос требует, чтобы вы вызвали UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX() заранее, когда в однопроходном режиме. Unity также включает в себя аналогичные макросы для текстур глубины и отображения теней пространства экрана. Вы можете увидеть полный список в нижней части HLSLSupport.cginc.