Однопроходное стерео рендеринг для 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.