Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problemas Alpha en SDL/OpenGL

Iniciado por Pitxardo, 17 de Febrero de 2007, 12:43:19 PM

« anterior - próximo »

Pitxardo

Bueno, el caso esque estoy haciendo mis pinitos con OpenGL usando SDL para el tema de lla ventana, las texturas, I/O y la musica/sonidos...

Al grano, mi problema es el siguiente:

- He creado una funcion que convierte un PNG a textura, tal que asi:



void textura::cargarTextura(char *tex) {

 SDL_Surface *dibujo = IMG_Load(tex);
 
 glGenTextures(1,&textur);
 glBindTexture(GL_TEXTURE_2D,textur);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);

 gluBuild2DMipmaps(GL_TEXTURE_2D, 3, dibujo->w, dibujo->h, GL_RGB, GL_UNSIGNED_BYTE, dibujo->pixels);

 SDL_FreeSurface(dibujo);

}



Donde, carga un archivo PNG, previamente creado en Photoshop en formato RGB ( Imagen > Modo > Color RGB )

El caso, es que la textura sale correctamente dibujada, el problema viene cuando creo particulas, que quiero que por ejemplo el color negro del dibujo no se represente (para que no queden cuadrados feos que se tapen entre si). Es decir, quiero que el canal Alpha se represente...

Esta claro que uso formato RGB constantemente, el cual no tiene un cuarto canal Alpha, pero esque he probado y leido de todo, pero nada de nada me funciona, he cambiado:

gluBuild2DMipmaps(GL_TEXTURE_2D, 3, dibujo->w, dibujo->h, GL_RGB, GL_UNSIGNED_BYTE, dibujo->pixels);

por

gluBuild2DMipmaps(GL_TEXTURE_2D, 4, dibujo->w, dibujo->h, GL_RGBA, GL_UNSIGNED_BYTE, dibujo->pixels);

y cambiando la textura de color RGB a color Indexado...

...y un monton de cosas mas con funciones como SDL_SetColorKey(), SDL_SetAlpha(), SDL_DisplayFormatAlpha(), etc...

Y no hay manera de encontrar el modo de que se visualice sin esos bordes feos... Muchas veces incluso se visualiza mal o simplemente da error y termina la ejecucion...

Supongo que es un fallo tanto de programacion como a la hora de crear el archivo PNG. Pero me estoy volviendo loco!!!

Alguien seria tan amable de darme la "receta" exacta para que se represente todo correctamente y respetando el canal Alpha?  :cry:

Pogacha

2 cosas:
1 - El formato de la imagen que pasas debe ser consistente con opengl.
Si la imagen es del tipo RGB tienes que pasar RGB a opengl, si la imagen es del tipo RGBA tienes que pasar RGBA.

2 - Para activar el blending (la forma en que se mezcla la cara con el fondo) debes darle a openGl una serie de comandos:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // para alpha blending
glEnable(GL_BLEND);

// dibujo la cara

glDisable(GL_BLEND);


Para las particulas puedes usar alpha blending y usar la transparencia del png que es derecho.

Saludos

Pitxardo

Si, todo eso lo tengo en cuenta, pero sigue igual todo :(

Adjunto una captura para que lo veais:


AgeR

¿Has probado a ordenar las partículas por su lejanía? Prueba a renderizar de más alejada a más cercana.

ethernet

Tienes activo el depth_test? si es así desactivalo cuando pintes transparencias.

Pitxardo

Cita de: "ethernet"Tienes activo el depth_test? si es así desactivalo cuando pintes transparencias.

Muchas gracias!!!!

Era sin duda que dejaba el depth_test activado  :?

Joer, muchas gracias, me estaba volviendo loco con el tema  :D

marcode

Creo que basta con desactivar la escritura, la comprobación de profundidad tiene que seguir activa por si cae detras de un objeto.

glDepthMask(0);
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

BeRSeRKeR

De todas formas, con desactivar la escritura del depth buffer no sería suficiente en el caso de utilizar alpha blending. Además tienes que hacer lo que dice Ager, renderizar de atrás hacia adelante tus partículas.

De lo contrario es más que probable que una partícula que debería verse a través de otra no se vea porque se renderizó después de que se renderizara la que había delante (y por lo tanto, al hacer el alpha blending, no se tenía la información necesaria para hacer la mezcla de color).

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

Pitxardo

Si, acabo de realizar una prueba con ambas cosas, desactivando el GL_DEPTH_TEST o renderizando de atras hacia delante.

Con el GL_DEPTH_TEST desactivado me dado cuenta de que se superponen todas las particulas a toda la escena. Es decir, aunque haya una caja entre la camara y la particula, la particula se sigue viendo. Soluciona mi problema, pero hace ese feo efecto de superposicion a todo... Aunque puede ser util para ciertas cosas  :P

Renderizando de atras hacia delante tambien se soluciona el problema y ya no se superponen a todo. Pero en cuanto miras las particulas desde atras, vuelve a salir el error (es logico). Una solucion seria ordenarlas constantemente por lejania de la camara, para decidir el orden de escritura.

Ahora me tengo que marchar, asi que ya seguire probando. Me queda probar ese glDepthMask(0);

Gracias a todos  :D

BeRSeRKeR

Hola.

El depth test lo tienes que activar, sólo desactivas el depth write. De lo contrario, en el caso de que tengas otro tipo de geometría como muros, las partículas siempre se renderizarían por encima, incluso aquellas partículas que estuvieran ocultas detrás de alguno de ellos.

En cuanto a lo de ordenar de atrás hacia adelante, sí, tienes que hacerlo en cada frame y en view space (transformas la posición de la partícula a camera-space y entonces ordenas por Z).

De todas formas esto depende del tipo de blending que utilices. Si por ejemplo utilizas additive blending no necesitas ordenar. El tipo de blending ya va a depender del tipo de efecto que quieras llevar a cabo.

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






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.