Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Transparencias

Iniciado por ProD, 04 de Noviembre de 2003, 01:17:43 PM

« anterior - próximo »

ProD

 Hola buenas, de nuevo paso por el foro para ver si alguien me puede ayudar con un problemita con el que más de uno se habrá topado.. o eso espero... bueno voy al  grano.

Estoy pintando un escenario y me encuentro con el problema de los bonitos arbolitos, etc, vamos todo aquello que lleva "alpha" entonces bueno lo típico.. pripero se pintan las caras sólidas y luego las transparentes... hasta aquí bien pero que pasa cuando la cámara mira esos objetos transparentes desde un punto de vista diferente... pues que se va al traste todo ya que si hay objetos transparentes unos detrás de otros... es importante pintar de "átras alante..." entonces mi pregunta es si por cada frame tengo que ordenar los polys transparentes teniendo en cuenta la posición de la cámara... o si hay alguna forma de hacerlo alternativa...

muchas gracias y un saludo.
as ideas son capitales que sólo ganan intereses entre las manos del talento

Zaelsius

 No hay otra opción(que yo conozca) que ordenar por profundidad tus objetos transparentes antes de pintarlos. Normalmente el tomar la coordenada Z de alguno de sus vértices te servirá bien. Véase qsort() o std::sort()  :)

Edit:  lo de la coordenada z está mal dicho la verdá.. se me fue la cabeza xD. Bueno, realmente es la distancia a la cámara(la Z si la cámara estuviese fija mirando hacia el frente). Creo que tampoco haria falta utilizar una distancia exacta(que sería muy costosa), y con una "squared_dist()" bastaría.

synchrnzr

 Ahora tendría que salir algun agüelete del foro y decir "Esto en mis tiempos con el BSP no pasaba..." (twist)

sync

BeRSeRKeR

 Otra opción podría ser utilizar alpha test para el tema de los árboles. Si no recuerdo mal, el alpha test se realiza antes que el depth test por lo que el orden de profundidad no importaría. Otra cosa es que el resultado obtenido sea el que buscas. Normalmente con alpha blending, los bordes entre lo opaco y lo transparente estarán más suavizados mientras que con alpha test es más brusco.

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

_Grey

 Se tienen que ordenar los polys, y RECUERDA dejar los poligonos con tansparencias para el final.

DraKKaR

 Yo no ordeno los polígonos:

1.- Pintar las caras sólidas (sin alpha)
2.- Pintar las caras con alpha < 1
2.1. - Deshabilitar la escritura en Zbuffer
2.2. - Pintar las caras
2.3. - Habilitar la escritura en Zbuffer

Creo que es un método correcto, ya que si un objeto tiene un alpha <1 es lógico que si se pinta un objeto tras él, podrá llegar a verse a través de él. Así te evitas ordenar nada. Además msirve también para los sistemas de partículas.

PD: A mi me funciona bien XD

Zaelsius

 Pensándolo bien.. con el método de Drakkar(no lo habia visto antes) se ahorra CPU a costa de sacrificar fillrate. Supongo que dependerá de la situación el mejor método a utilizar.

Drakkar, ¿los pasos 1-2 los haces mirando en cada poly, o ya tienes una lista precalculada de objetos con/sin alpha ?

DraKKaR

 Lo hago de una forma sencilla. Lo compruebo por cada objeto en mi motor, cuando éste va a renderizarse. Para cada uno, considero que no es opaco si:
- tiene un alpha < 1
ó
- tiene una textura de 32 bits (con canal alpha)

El render de esos objetos son relegados a dibujarse en una segunda pasada, mientras que los objetos que no cumplan ninguna de las propiedades anteriores son considerados opacos y se renderizan en una primera pasada. De esta forma solo cambio el estado del zbuffer una vez por fotograma, no una vez por objeto.

PD: Es cierto que consume más fillrate, pero no comsume nada de CPU. Esto es especialemnte importante en lso sistemas de partículas, ya que no tienes que estar ordenando muchos objetos cada fotograma, cuando lo normal es que todos ellos lleguen a pintarse y ninguno oculte totalmente a otro, por lo que el fillrate debería ser el mismo (al menos en este caso).

Schaffer

 Sobretodo ese metodo es perfecto para sistemas de particulas, ya te dije DraKKaR que billboards sin ordenacion con texturas con transparencias diferentes darian problemas, imagina el humo de la nave y un quad con la textura de un arbusto.

Por cierto, si os interesa es el metodo propuesto para pintar con transparencias en el libro rojo de OpenGL.

Mira, se me acaba de ocurrir, mezclando ambos metodos sale una solucion un poco mejor, que seria solo ordenar los objetos con transparencias.

Si digo alguna tonteria me lo decis.

ProD

 Ok muchas gracias a todos, yo uso D3D para pintar.. imagino que tendré que activar el ALPHA_TESTING
y colocar un valor de referencia... pero lo que no entiendo bien (nunca lo he utilizado) es quien asigna un valor de alpha a cada poligono... va en la textura? vamos alguien que me explique un poco como va el alpha_test si puede ser en D3D mejor. un saludo y de nuevo muchas gracias.

as ideas son capitales que sólo ganan intereses entre las manos del talento

MChiz

 Yo no veo el metodo de Drakkar. Si que es correcto para blendings aditivos, pero para combinativos creo que no. Es el tipico problema. Me lo explique, porfavor? ;b

Gracias!

BeRSeRKeR

 Yo la verdad es que tampoco tengo muy claro el método de Drakkar. Como dice Mchiz, si se utiliza el método de blending (SRC_ALPHA, INV_SRCALPHA), es necesario ordenar ya que aunque renderices al final las caras con transparencia, entre ellas mismas, habrán algunas que al renderizarse en un orden incorrecto, no aparecerán correctamente ya que en el frame buffer no existirá la información correcta para realizar la mezcla.

Por otra parte, ProD, el tema del alpha test es como dices. Además, para especificar las partes transparentes, lo tendrás que hacer a través de un canal alpha en la textura o bien utilizar el parámetro colorkey de la función D3DXCreateImageFrom***Ex, a través del cual, especificas el color que representa un pixel transparente. Supongo que esta función lo que hace es automáticamente crear un canal alpha en base al color transparente especificado.

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

_Grey

 Pues me uno a los que tienen problemas con el metodo de DraKKaR, si lo que hace es que aplica alphatest, "pos fale",si es ADD BLENDING "pos fale" tambien, pero si es la tipica trasparencia que hay que sacar la media del color a pisar y el propio (se me habra entendido?) estonces CASTAÑA!, a no ser que se pinten de un principio en el orden correcto cogiendo la posicion del objeto, que da la impresion que es lo que dice..... :blink:  :blink:

en fin , no se, no se......

DraKKaR

 Juas juasjuasjuas, pues la respuesta es mucho más simple de lo que vosotros creeis: simplemente el método no es perfecto: no habia pensado que objetos con transparencias con distintas texturas con canales alpha distintos podrían dar problemas de transparencias, y de hecho todavia no se habia dado el caso en el juego. Me parece que sí será necesario ordenar para asegurarse de que todo sale bien.

Hay! si ya me lo advirtió el Schaffer pero no le entendí v.V.

Ale a cascarla  

PD: Matrix moló digais lo ke digais (sobretodo la batalla de Mechs/makinas ke es a lo ke está orientada la peli: acción)

MChiz

 ^_^ Pues aun es mas sencillo que eso

Prueba a pintar un quad con una textura con un alpha y todo lo que quieras y detras pinta el mismo quad, todo exactamente igual pero desplazado unas unidades, y se vera mal ( aunque deshabilites el ZBuffer ). Todo esto con blending combinativo, por supuest.






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.