Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: [Over] en 09 de Febrero de 2005, 01:23:32 PM

Título: Ordenacion De Transparencias En Opengl
Publicado por: [Over] en 09 de Febrero de 2005, 01:23:32 PM
 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.
Título: Ordenacion De Transparencias En Opengl
Publicado por: BeRSeRKeR en 09 de Febrero de 2005, 01:31:46 PM
 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.
Título: Ordenacion De Transparencias En Opengl
Publicado por: Pogacha en 09 de Febrero de 2005, 02:53:07 PM
 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
Título: Ordenacion De Transparencias En Opengl
Publicado por: vincent en 09 de Febrero de 2005, 03:16:00 PM
 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
Título: Ordenacion De Transparencias En Opengl
Publicado por: Helius en 09 de Febrero de 2005, 03:20:40 PM
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.
Título: Ordenacion De Transparencias En Opengl
Publicado por: senior wapo en 09 de Febrero de 2005, 03:48:20 PM
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.
Título: Ordenacion De Transparencias En Opengl
Publicado por: Helius en 09 de Febrero de 2005, 06:13:08 PM
 Mmm claro  ;)

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

Gracias!
Título: Ordenacion De Transparencias En Opengl
Publicado por: samsaga2 en 10 de Febrero de 2005, 08:31:56 AM
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.
Título: Ordenacion De Transparencias En Opengl
Publicado por: [Over] en 10 de Febrero de 2005, 09:56:07 AM
 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.
Título: Ordenacion De Transparencias En Opengl
Publicado por: senior wapo en 10 de Febrero de 2005, 10:38:14 AM
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  ;)  
Título: Ordenacion De Transparencias En Opengl
Publicado por: senior wapo en 10 de Febrero de 2005, 11:09:17 AM
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:

(http://img139.exs.cx/img139/1250/culling7dw.png)
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
Título: Ordenacion De Transparencias En Opengl
Publicado por: samsaga2 en 10 de Febrero de 2005, 02:42:34 PM
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.
Título: Ordenacion De Transparencias En Opengl
Publicado por: samsaga2 en 10 de Febrero de 2005, 02:44:18 PM
 
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.
Título: Ordenacion De Transparencias En Opengl
Publicado por: Helius en 10 de Febrero de 2005, 03:26:35 PM
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.