El rendering de estéreo de un solo pase es actualmente compatible con los dispositivos Gear VR y Daydream. Para habilitar esta función, utilizamos GL_OVR_multiview2 y GL_OVR_multiview2 Extensiones de OpenGL | ES *. Estas extensiones requieren el uso de una matriz 2D de textura con 2 cortes (una porción por ojo). Esto difiere de nuestra implementación de PC / PS4 donde simplemente utilizamos una textura 2D doble ancha. Por lo tanto, se requieren diferentes cambios de sombreado.
Es posible que deba incluir el código adicional que se detalla a continuación para utilizar el rendering estéreo de paso único con sus shaders personalizados. Esto no se aplica a shaders de superficie o shaders de de pipeline con función fija que Unity convierte automáticamente, excepto los shaders de superficie que tienen un procesamiento de vértices personalizado.
Tenga en cuenta que estos cambios de shader script son compatibles con el rendering estéreo Multi-Pass, por lo que no habrá efectos secundarios en ese modo.
En primer lugar, si desea utilizar unity_StereoEyeIndex
en las etapas de shader después del shader de vértices, debe declarar UNITY_VERTEX_OUTPUT_STEREO
en cualquier estructura de salida de la etapa shader que tenga. Aquí hay un ejemplo:
struct v2f {
float2 uv : TEXCOOR0;
float4 vertex : SV_POSITION;
UNITY_VERTEX_OUTPUT_STEREO
};
Luego debe usar UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO()
en la función shader de vértices para inicializar los datos de salida:
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;
}
Para inicializar unity_StereoEyeIndex
en etapas subsiguientes, debe agregar UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX()
al principio, así:
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;
}
Si está utilizando otras etapas shader, también debe usar la macro UNITY_TRANSFER_VERTEX_OUTPUT_STEREO()
para transferir el índice de ojo a las etapas posteriores.
Finalmente, recomendamos que use UnityObjectToClipPos (IN.vertex)
en lugar de mul(UNITY_MATRIX_MVP, IN.vertex)
para calcular la posición final del objeto.
Los shaders de posprocesamiento deberán actualizarse para tratar las texturas oculares como una matriz 2D de textura. Para ayudar con esto, hemos creado la siguiente macro: UNITY_DECLARE_SCREENSPACE_TEXTURE()
. Esta macro se debe usar para envolver todas las texturas, de modo que la textura funcione en los modos de paso múltiple y paso único.
Al muestrear la textura, se debe usar la siguiente macro:
UNITY_SAMPLE_SCREENSPACE_TEXTURE()
Esta macro requiere que UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX()
ya haya sido llamado de antemano cuando esté en modo de paso único. También hemos creado macros similares para texturas de profundidad y mapas de sombras de espacio de pantalla. Puede ver la lista completa en la parte inferior de HLSLSupport.cginc.
Consulte la página Vertex and fragment shader examples para obtener más información sobre el código shade.
* Estas extensiones de OpenGL|ES son relativamente nuevas, por lo que lamentablemente puede haber problemas relacionados con los gráficos debido a los controladores en estos teléfonos.
New feature in 5.5
2017–06–20 Page published with limited editorial review