Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Sobre Oclusion Querys

Iniciado por tamat, 14 de Octubre de 2003, 01:52:41 PM

« anterior - próximo »

tamat

 Una de las cosas que me sorprendió al empezar a usar OGL era que se trataba de un API de muy bajo nivel, más de lo que en un principio esperaba, sin embargo conforme avanzo me sorprendo al ver que muchas cosas que esperaba encontrar no han sido implementadas.

Una de ellas hace alusión al tema de la oclusión, me extraña que no exista una función mediante la cual podamos solicitar a la tarjeta el pintado de un triangulo y que si durante el proceso se da el caso de que deba alterar el colorbuffer (despues de hacer cliping, y comprobar el Zbuffer del pixel a pintar) pues no lo haga y retorna 1, si por el contrario hace todo el pintado del poligono y no ha tenido que alterar ningun pixel del colorbuffer entonces retorna 0, de este modo sabemos si un poligono está o no ocluido.

Mediante esto el sistema de oclusiones por bounding boxes sería rapidisimo ya que antes de pintar cualquier personaje solo tendríamos que pintar las 6 caras de la AABB (aunque con las 3 visibles bastaria) y olvidarnos de complicados calculos de CPU. Sería ideal para oclusiones pequeñas como cuando un enemigo se esconde detras de una caja del escenario o incluso para el frustum culling de objetos muy cercanos.

Sin embargo hasta la fecha no he visto que exista tal función sin embargo ahora me entero de que NVIDIA ha propuesto una extensión para OGL 1.5 que se llama Oclusion Querys y que sirve para determinar la visibilidad de un vertice.

Son los oclusion querys lo que busco? se acerca? existe algo que me pueda servir?

Gracias.
Por un stratos menos tenso

BeRSeRKeR

 En Delphi3D se publicó una demo que utilizaba precisamente la extensión GL_NV_occlusion_query que hace lo que quieres. Es la demo de la mega fábrica que ocupaba ciento y pico megas :D

Saludos
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

MChiz

 Holaaa!

Como dice Berserker, GL_NV_occlusion_query es la extension que buscas. Si no estoy equivocado, tan solo esta disponible a partir de la GeForce 4 TI ( no se si la 3 ). Y solo decir que TODO lo que se puede hacer con Direct3D tambien se puede hacer con GL, mas que nada porque es la tarjeta quien lo hace :b

Un saludote!!

BeRSeRKeR

 Según esta página, también existe en las GeForce3...

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

aphex

 gf3, ati a partir de 8500, xbox

y no, no es la solucion exactamente, porque para determinar la oclusion tiene que pintar el oclusor, cosa que suele consumir mucho fill-rate. oclusion query es mas util si puedes hacer estimaciones conservadoras del oclusor... por ejemplo, en un algo de terreno con personajes, con usar un pixel por encima de la cabeza, ya tienes la oclusion de todo el personaje... no se si me explico. no es buena idea usar un oclusor que sea BV de todo el objeto

Haddd

 Para poder utilizar el sistema de oclusión por hardware y conocer si se ve o no un determinado objeto por BB, primero tienes que haber dibujado TODA la escena para que el ZBuffer sea el correcto!!

tamat

 Gracias a todos por la info. Varias cosas:

Todavia no me queda claro si la extensión Oclusion Query es lo que yo busco o es algo "parecido", me da la impresión de que no es exactamente lo que describía en mi anterior post sino que solo chequea puntos y en ese caso no entiendo que utilidad tiene ya que podemos proyectar el punto 3D en el viewport y leer el Z-Buffer para saber la profundidad de un pixel dado.

Sobre lo de tener que pintar primero todo el escenario weno, no se me había ocurrido pero más o menos es lo que tenía pensado ya que lo quiero utilizar para hacer la oclusion de los items del escenario (objetos, personajes, etc) y lo haría una vez finalizado el pintado de la mesh del escenario.

Y para Aphex, weno, lo de que comentas de que consume fillrate pues se veía venir, pero así dejas el peso del oclusion culling en la GPU y no en la CPU además siempre será mas simple de programar, luego con el tiempo pues ya lo portaría a la CPU mediante geometría. Además hablamos de tres poligonos que no tienes porqué ser demasiado grandes y seguro que siempre será más rapido que no chequear boxes contra boxes por todo el escenario.
Y otra cosa, no me queda claro lo de hacer la oclusion de todo el personaje mediante el chequeo de un unico punto encima de la cabeza, ¿que sucede si solo se le ven las piernas? o si algo tapa su cabeza? (una tubería mismamente). Yo busco una solución total, no quiero soluciones aproximadas que luego den lugar a bugs como en algunos juegos en los que en determiandos casos ves desaparecer items de delante tuyo (y no me refiero al LoD). Luego ya miraría como simplificarlo para optimizar el proceso.

Weno, seguiré investigando. Gracias de nuevo.
Por un stratos menos tenso

Zaelsius

 En caso de utilizar un mapa de alturas simple como terreno.. si un punto sobre la cabeza de un personaje no es visible tampoco lo será el resto de su cuerpo. Está claro que ésto sólo sirve para saber si algo está ocluido por el terreno, no por otro tipo de geometría.

PD: Las soluciones "totales" sobre lo que comentas no existen por ahora...  hay muchas maneras de hacerlo y cada una se adapta mejor a un tipo de juego en concreto. Vamos, que no esperes que haya un algoritmo que sea el más eficiente para todos los casos y tb el más general.

Zaelsius

 Para los que usamos DirectX, la función de la API para jugar con esto es:


HRESULT CreateQuery(D3DQUERYTYPE Type,  IDirect3DQuery9** ppQuery);


Pasándole como 1º parámetro D3DQUERYTYPE_OCCLUSION .

Lo que pone en la SDK acerca de esto es:
Citar
D3DQUERYTYPE_OCCLUSION

An occlusion query returns the number of pixels that pass z-testing. These pixels are for primitives drawn between the issue of D3DISSUE_BEGIN and D3DISSUE_END. This enables an application to check the occlusion result against 0. Zero is "fully occluded," which means the pixels are not visible from the current camera position.


MChiz

 Para poder utilizar el sistema de oclusión por hardware y conocer si se ve o no un determinado objeto por BB, primero tienes que haber dibujado TODA la escena para que el ZBuffer sea el correcto!!

Esto no tiene porque ser asi. Puedes tener la geometria ordenada de cerca a lejos : ) Y si solo quieres el occlusion query para personajes, primero pintas la geometria de mundo y luego a tirar de occlusion querys para lo demas.

CitarTodavia no me queda claro si la extensión Oclusion Query es lo que yo busco o es algo "parecido", me da la impresión de que no es exactamente lo que describía en mi anterior post sino que solo chequea puntos y en ese caso no entiendo que utilidad tiene ya que podemos proyectar el punto 3D en el viewport y leer el Z-Buffer para saber la profundidad de un pixel dado.

La extension occlusion query viene a ser esto, pero de forma asincrona. No utilices NUNCA ( en realtime, se entiende ) la funcion glReadPixels o similares. Te joden el paralelismo entre GPU y CPU.

Un saludote!

tamat

 Ok, pues gracias Zaelsius y MChiz, me habeis solventado las dudas y además me habeis prevenido de posibles fallos :D
Por un stratos menos tenso

MChiz

 A mandar. Me alegro de haberte ayudado!

talueK!!

ibasurto

 Los enlaces de las extensiones relacionados (por orden de "bondad" B) )

GL_ARB_occlusion_query

GL_NV_occlusion_query

GL_HP_occlusion_test






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.