Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Novato con frustum culling en opengl

Iniciado por Eskema, 26 de Octubre de 2009, 08:18:13 PM

« anterior - próximo »

Eskema

Muy buenas, estoy empezando en esto del 3d con opengl y tengo unas preguntas de novato total, he llegado a la parte de aprender el frustum culling ese para no dibujar mas de la cuenta. Leyendo informacion por la red no me quedan claros algunos aspectos que paso a preguntaros.

Una vez sacado el frustum, vamos mirando las cajas o esferas que estan dentro para saber que se dibuja, ¿pero cuando algun objeto esta solo mitad dentro mitad fuera que ocurre?, ¿se dibuja entera o automaticamente la tarjeta de video sabe que solo debe dibujar una parte?, no me queda claro si se dibuja entera o no.
En caso de dibujarse entera y si quiero optimizar las cosas debo cortar yo la malla de alguna forma, en este caso, ¿esa tecnica tiene algun nombre para que investigue?.

Mas aun, supongamos que tengo una casa y 2 arboles detrás de ella, todo esta dentro del frustum, pero la casa tapa a los arboles, ahora para mejorar mi frustum, una vez visto que esos objetos estan dentro, deberia trazar un rayo desde la camara hasta los objetos, y si el rayo no llega es que estan tapados y por tanto no los dibujo. ¿Esto es una burrada o se hace asi?

Saludos,

senior wapo

#1
En un PC todo lo que asome por el frustum, aunque sea parcialmente, se manda dibujar y que se apañe la tarjeta de video. Cuando sepas más y tengas que hacer determinadas aplicaciones muy específicas ya tendrás tiempo de complicarte la vida. Googlea Guard Band Clipping si tienes curiosidad por saber lo que hace la tarjeta con los trozos que se salen de la pantalla.

Respecto a la oclusión, generalmente se dibuja todo porque sale más caro decidir si asoma algún pixel que mandarlo dibujar todo. Con un rayo no arreglas nada porque solo compruebas si ese pixel en particular se ve, no si se ve el resto.

Si estás pintando con shaders complejos, y por ello, caros de calcular, lo normal es que primero pintes en color sólido toda la escena para rellenar el buffer de profundidad (zbuffer) y luego vuelvas a dibujar la escena con shaders en condiciones de manera que solo se apliquen a pixes que realmente se ven. La pasada inicial de relleno se suele hacer con el buffer de color desactivado, porque no tiene sentido pintar el color de los pixeles si luego los vas a sobreescribir con el shader.

Si de todas maneras insistes en hacer algún tipo de culling para no mandar dibujar objetos que puedan estar tapados por otros, tienes varias opciones para escenas genéricas (luego hay casos particulares para cada tipo de escena):

1. Hardware Occlusion Queries. Consisten en enviar a la tarjeta los objetos y que en el último momento antes de pintar cada pixel no llegue a hacerlo y simplemente lleve la cuenta de cuantos pixeles se verían. El problema es que preparar cada consulta le supone a la tarjeta gráfica un coste de tiempo importante. Se suele amortizar mandando 3-4 objetos en una misma consulta y si se ve alguno, pintar todos ellos
aunque alguno realmente sea invisible. Hacer una consulta por cada objeto sería prohibitivo.

2. Software Occlusión Queries: Te pintas tu la escena "a mano" con tus propias rutinas de pintado de triángulos en un area de memoria tuya sin usar la tarjeta de video ni opengl ni nada y llevas la cuenta de que píxeles se ven. Realmente solo "pintas" el zbuffer, no pixeles de colores. El truco consiste en que la escena la pintas a resolución muy baja, digamos  160x90 pixeles para tardar poco. Con éste método puedes comprobar objetos individuales e incluso pintar solamente sus bounding boxes alineados con la pantalla (un simple recuadro).

3. Hacer oclusión con geometría que no coincide con la que pintas sino que está hecha a base de paralepipedos (cubos estirados). Se puede combinar con la opción 2 o usar cálculos geométricos. Para los objetos que deben "tapar" usas "cajas" que esén totalmente incluidas en el volumen del objeto mientras que para los objetos a comprobar usas cajas que envuelven completamente al objeto.

Me he cansado de escribir asi que lo dejo aquí.

Eskema

Estupendo, muchas gracias por las ideas, ya tengo cosas para investigar :)






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.