Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Ordenacion De Transparencias En Opengl

Iniciado por [Over], 09 de Febrero de 2005, 01:23:32 PM

« anterior - próximo »

[Over]

 Hola.

He leido que para que las transparencias en OpenGL se vean correctas hay que ordenar el dibujado de atras hacia adelante.

Mi duda era si quizas existia algún tipo de flag que te hiciera esas comprobaciones automaticamente y demas. Sin tener que introducir código que gestione este orden de renderizado.

¿Que tipo de tecnica usais vosotros para dibujar los alphas y demas? :D.

Gracias.

BeRSeRKeR

 Hay veces en los que utilizar additive blending te da el resultado buscado y te ahorras tener que ordenar de atrás a adelante. De lo contrario sí tendrás que ordenar. Los juegos como Quake utilizan un arbol BSP para eso.

Saludos.

PD: Si esto lo quieres para partículas, te bastará con ordenar por la distancia de las partículas a la cámara, de lo contrario tendrás que utilizar por ejemplo un arbol BSP.
PD2: si se trata de ordenar en un mundo 2D la cosa será más sencilla, te bastaría con asignar una Z para ordenar los sprites.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Pogacha

 No hay flag para que opengl ordene ni nada parecido.
Generalemente la tecnica es:
1ro - Dibujo todo lo que no tenga alfa o solo tenga alfa.masking, en cualquier orden, usando el z-buffer.
2do - Dibujo todo lo que tenga alfa-blending o adding de atras para adelante.

Para ordenar los objetos o poligonos puedes utilizar la distancia a la camara o alguna estructura especial como un arbol bsp o un oct tree o un cuad tree.

Saludos

vincent

 Mirate este post de gamedev Fastest way to sort a scene.

Tambien hay por ahi una pagina con el código y la explicación pero no la encuentro. Si lo hago, ya lo postearé.

Suerte!

VinCenT
Desarrollo en .Net y metodologías http://devnettips.blogspot.com

Helius

Cita de: "Pogacha"Para ordenar los objetos o poligonos puedes utilizar la distancia a la camara o alguna estructura especial como un arbol bsp o un oct tree o un cuad tree.
Una pregunta vaga: ¿Cómo renderizas de atrás hacia adelante un octree?

Saludos.
Geardome Devlog
Tutoriales sobre DirectX 9, Nintendo DS y PSP.

senior wapo

Cita de: "Helius"Una pregunta vaga: ¿Cómo renderizas de atrás hacia adelante un octree?
Una respuesta vaga: de la misma forma que cualquier otro arbol: Para cada plano de separación dibujas primero lo que haya en el subespacio opuesto al de la cámara.

Helius

 Mmm claro  ;)

De todas formas miraré algoritmos para recorrer transversalmente un octree porque puede serme muy útil  :)

Gracias!
Geardome Devlog
Tutoriales sobre DirectX 9, Nintendo DS y PSP.

samsaga2

Cita de: "senior wapo"
Cita de: "Helius"Una pregunta vaga: ¿Cómo renderizas de atrás hacia adelante un octree?
Una respuesta vaga: de la misma forma que cualquier otro arbol: Para cada plano de separación dibujas primero lo que haya en el subespacio opuesto al de la cámara.
Es facil, calcula la distancia desde el centro de los nodos a la camara y despues renderizas primero los nodos que esten mas lejos y listo.

[Over]

 Hola.

El escenario de mi juego será (creo) un conjunto de tiles (3D) donde iran objetos y tal formando el escenario. Supongo (estoy muy verde en ese tema) que usando la tecnica del Octree para optimizar el dibujado, podria aprovechar para la ordenación de nodos de una escena.

Ya aprovecho para pedir tutoriales y demas sobre optimización, tema de frustum y octrees. Se que hay mucho en google, pero aparecen muchos que no merecen la pena, quizas ustedes ya "perdieron" ese tiempo y encontraron los mejores.

Gracias.

Saludos.

senior wapo

Cita de: "samsaga2"Es facil, calcula la distancia desde el centro de los nodos a la camara y despues renderizas primero los nodos que esten mas lejos y listo.
Hombre, si tienes una estructura de datos (Octree) que ya te da un orden implícito, ¿ para qué vas a calcular y ordenar distancias de nodos ?  El Octree está precisamente para evitar eso  ;)  

senior wapo

Cita de: "[Over"] El escenario de mi juego será (creo) un conjunto de tiles (3D) donde iran objetos y tal formando el escenario
...

Ya aprovecho para pedir tutoriales y demas sobre optimización, tema de frustum y octrees.
Si vas a usar un escenario de tiles, un quadtree/octree te vale, si. Dependiendo del tipo de escenario, no subestimes la posibilidad de usar una simple matriz de celdas :)

En cuanto a optimizar frustums:
- Googlea "BoxOnPlaneSide", una función de culling hecha famosa por ser usada en el código fuente de Quake. Con solo comprobar dos "pseudo-vertices" de un bounding box, te dice a que lado de un plano está la caja (util para comparar contra los planos de fustrum de la cámara, o colisiones en un arbol BSP o mil cosas).
Si te bajas los fuentes del motor C# de Hadd tienes la misma función en C# usando un solo vértice, aunque ahí ya pierdes precisión de culling.

Básicamente envuelve un BBox orientado, con un AABB (BoundingBox alineado con los ejes XYZ) y dependiendo de la orientación del plano (analizando los signos de la normal) escoge los vértices potencialmente más cercano y lejano para comparar. O dicho de otra forma, mira en que octante se "mete" la normal, y ya sabes que vértice estaría mas cerca del plano y cual más alejado. Si escoges solo el vértice más cercano te vale también, pero pierdes la capacidad de detectar casos especiales (más importante esos casos para usarlo en colisiones que para culling realmente).

Aqui te pego una imagen del proceso en 2D, simplemente repites la comprobación para cada plano que forma el frustum:


Visto desde arriba: Para planos P1 y P2 comprobarías los vértices marcados en azul, los marcados en rojo serían para P3.

Todo este rollo solo es para que entiendas el algoritmo. Si te lias, te basta con copiar el código de BoxOnPlaneSide :P

samsaga2

Cita de: "senior wapo"
Cita de: "samsaga2"Es facil, calcula la distancia desde el centro de los nodos a la camara y despues renderizas primero los nodos que esten mas lejos y listo.
Hombre, si tienes una estructura de datos (Octree) que ya te da un orden implícito, ¿ para qué vas a calcular y ordenar distancias de nodos ?  El Octree está precisamente para evitar eso  ;)
Para que? Solo respondia la pregunta. Por otro lado es mas "optimo" renderizar de adelante a atras (las tarjetas optimizan mirando el z-buffer) y es una cosa imprescindible si quieres tirar de occlusions.

samsaga2

 
Cita de: "senior wapo"Todo este rollo solo es para que entiendas el algoritmo. Si te lias, te basta con copiar el código de BoxOnPlaneSide :P
Si haces eso tendras que publicar tu codigo bajo GPL que es la licencia que usa el codigo fuente del Quake.

Helius

Cita de: "samsaga2"Para que? Solo respondia la pregunta. Por otro lado es mas "optimo" renderizar de adelante a atras (las tarjetas optimizan mirando el z-buffer) y es una cosa imprescindible si quieres tirar de occlusions.
Para evitar tener que ordenar. El octree es una ordenación del espacio por lo tanto ya lo tienes ordenado, lo que yo quería saber es cómo se podía recorrer el octree de forma transversal, que resulta que es igual que en un BSP pero teniendo en cuenta 3 planos de división en vez de 1.

Por cierto, he encontrado un enlace interesante sobre esto: http://www.flipcode.com/articles/harmless_...s_issue02.shtml

Estábamos hablando de transparencias, de ahí que fuese de atrás hacia adelante ;)

Saludos.
Geardome Devlog
Tutoriales sobre DirectX 9, Nintendo DS y PSP.






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.