VR y sacrificio de frustum

13

Al renderizar entornos de realidad virtual (vista estéreo), ¿me recomiendan simplemente hacer 2 comprobaciones de frustum para determinar qué se dibujará durante el pase de eliminación de frustum o hay alguna otra verificación que pueda combinar ambos frusta?

Garry Wallis
fuente

Respuestas:

13

Es bastante fácil crear un solo tronco que encierra los dos ojos individuales, como se muestra en este diagrama creado por Cass Everitt en Oculus. Solo tienes que colocar un poco el vértice de este tronco entre los ojos y detrás de ellos. También puede aumentar la distancia del plano cercano para que coincida con el plano cercano original del ojo frusta.

ingrese la descripción de la imagen aquí

Tal frustum incluye un pequeño espacio que no estaba en la unión de los dos frusta originales. Hay un pequeño volumen horizontalmente entre los dos ojos; Además, el diagrama no muestra la dimensión vertical, pero al tirar hacia atrás el vértice del tronco hace que se incluya algo de espacio por encima y por debajo del frusta original. Sin embargo, para fines prácticos de eliminación probablemente no importa. El sacrificio de frustum suele ser conservador de todos modos, y el espacio extra tiene solo unos pocos centímetros de grosor.

También es posible simplemente sacrificar contra los planos superiores e inferiores originales de frustum (que se comparten entre los ojos) junto con los planos laterales exteriores. Estos planos no forman un tronco, técnicamente, pero si se usa el algoritmo de eliminación "habitual" que prueba contra un plano a la vez, el algoritmo funcionará felizmente en cualquier conjunto de planos que desee darle.

Compartir el sacrificio, la selección de LOD, etc. entre los ojos, en lugar de volver a hacerlo dos veces cada fotograma, es una excelente manera de optimizar el costo de la CPU del renderizado estéreo. Esto también es un requisito previo si desea utilizar un método de representación que dibuje ambos ojos en una sola pasada, como la representación estéreo instanciada .

Nathan Reed
fuente
2
Gracias Nathan, eso es exactamente lo que estaba buscando, ¿de dónde sacaste este diagrama? Puedo preguntar, ¿está en alguna documentación pública de Oculus?
Garry Wallis
2
@GarryWallis Cass lo tuiteó hace unos meses.
Nathan Reed
5

He generalizado los resultados de Everitt si es necesario.

tronco común generalizado

Como beneficio adicional, una forma de extraer left0 / right0 de las matrices de perspectiva de los ojos:

left0   = n0 * (Mle13 - 1) / Mle11;
right1  = n1 * (Mre13 + 1) / Mre11;

Si tienes fila mayor. transponer para columna mayor. cf esta respuesta

v.oddou
fuente
4

Tenga cuidado, usar un solo tronco para el sacrificio solo funciona si el campo de visión combinado de los ojos es inferior a 180 grados. Ahora hay auriculares VR con un campo de visión más amplio de alrededor de 200 grados, es decir, el Pimax 5k + y StarVR . Es imposible construir un frustum de vista tradicional o una matriz de proyección única para un campo de visión de más de 180 grados.

Estos auriculares usan pantallas en ángulo, por lo que los planos de proyección y los vectores hacia adelante en el espacio de visualización no son paralelos. Las ecuaciones de las otras respuestas aquí suponen que son paralelas y producirían resultados incorrectos cuando esa suposición es incorrecta.

Una sola vista combinada puede ser útil, pero su código debe estar preparado para tratar casos en los que esto no se pueda construir para garantizar que sea a prueba del futuro. Alternativamente, considere realizar el sacrificio por vista de ojo, o cambie a un sacrificio basado en ángulos que puede expresar un FOV mayor de 180 grados.

klausw
fuente