Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





OpenGL: Dibujar un quad con alfa de una imagen

Iniciado por NewMac, 27 de Noviembre de 2007, 12:51:33 PM

« anterior - próximo »

NewMac

Hola,

Me gustaría saber como se puede dibujar un quad de color utilizando el canal alfa de un png, por ejemplo para hacer la sombra de un sprite (bueno, quizás la sombra no sea un buen ejemplo porque se podría hacer con el vertex color, pero bueno, la idea es la misma :) He estado mirando y creo que es utilizando la función glTexEnvi() pero la ayuda que he encontrado en la red sobre esta función y los parámetros que lleva es muy pobre y no consigo sacar nada en claro.

Un saludo y gracias.

[EX3]

Si funciona de forma similar a Direct3D solo tendrias que configurar los render states (no se si se llaman igual en OGL) para que interpreten el canal alpha de la textura, esto seria independiente de lo que hagas despues con el quad (aplicar color para hacer un tintado, aplicar specular, etc...).

Creo que en este tutorial hablan de como interpretar el canal alpha de una imagen TGA, quizas te sirva:
Tutorial 8: Blending y Masking

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

misscelan


glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);

//RENDER DE TU QUAD

glDisable(GL_BLEND);

Si tu textura tiene componente alfa y las creado como GL_RGBA, esto te debería funcionar. Recuerda que hara el blending con lo que ya haya pintado así que ten en cuenta en que orden lo pintas.

Suerte!.

NewMac

Hola de nuevo,

CitarSi funciona de forma similar a Direct3D solo tendrias que configurar los render states (no se si se llaman igual en OGL) para que interpreten el canal alpha de la textura...

Sí, yo creo que es así, y me parece que se hace utilizando la función que comenté (glTexEnvi()), pero cuando busco la documentación en internet solo habla de 3 o 4 parámetros, y esta función tiene un huevo de parámetros ( o renderstates ), por lo que no sé como hacerlo.

Citar
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);

//RENDER DE TU QUAD

glDisable(GL_BLEND);

Eso no es para pintar una textura normal con alfa? quizás me he explicado mal, lo que yo quiero es pintar un quad con un color plano (por ejemplo, verde) pero que tome el canal alfa de un png, para que me salga p.e. una silueta verde.

[EX3]

Cita de: "NewMac"
Citar
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);

//RENDER DE TU QUAD

glDisable(GL_BLEND);

Eso no es para pintar una textura normal con alfa? quizás me he explicado mal, lo que yo quiero es pintar un quad con un color plano (por ejemplo, verde) pero que tome el canal alfa de un png, para que me salga p.e. una silueta verde.
Eso activa el uso del canal alpha, tanto en el color que le pasas para pintar la textura como en canal alpha de la textura si esta lo tiene. El color definira de forma uniforme en toda la textura un nivel de opacidad segun el valor del componente alpha y el de la textura segun el valor alpha del pixel.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

NewMac

CitarEso activa el uso del canal alpha, tanto en el color que le pasas para pintar la textura como en canal alpha de la textura si esta lo tiene. El color definira de forma uniforme en toda la textura un nivel de opacidad segun el valor del componente alpha y el de la textura segun el valor alpha del pixel.

Ya, pero si yo quiero indicarle el alfa por pixel supongo que tendré que indicarle la textura y luego ponerle la información de U y Vs en cada vértice, y si hago esto al final lo que consigo es que me pinte la textura, y yo lo único que quiero es que coja la información del alfa por pixel y se lo aplique a un quad de color plano.

Pogacha

Eso se puede hacer (aun que no es facil) ... pero en realidad si lo que quieres solo es una sombra hay un truco muy practico:
glBind(textureid);

glColor4f( 0.0f, 0.0f, 0.0f, 0.5f ); // aca le decimos que module la textura con negro, por lo tanto donde dibuje tan solo oscurecera, y que al alpha lo divida por la mitad.

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);


//RENDER DE TU QUAD

glDisable(GL_BLEND);


Yo creo que lo entenderas!
Suerte!

Edit:
Para poder usar el canal alfa con cualquier color deberas leerte sobre esta extension y tener mucha pero mucha paciencia.

http://www.opengl.org/registry/specs/ARB/texture_env_combine.txt

Esta extension es la que haria de control de los render states de OpenGL
Saludos!

Fran

Si no recuerdo mal, además, debes desactivar el buffer de profundidad, haciéndolo tras pintar los quads opacos (ojuanes)

Pogacha

Cuando trabajas en 2d generalmente desactivas el zbuffer, tanto en escritura como el ztest.

Fran

Cita de: "Pogacha"Cuando trabajas en 2d generalmente desactivas el zbuffer, tanto en escritura como el ztest.

Ya. Lo q ocurre es q OpenGL trabaja en 3D (el q sabes q estás en 2D eres tú) y ese parámetro está normalmente activado. Yo no sé si él lo sabe. Por eso se lo digo . Por si le sirve de algo. Ese es el típico error que puede hacer q no te funcione

Loover

Y recuerda que si la textura en cuestión solo tiene dos estados de alpha (totalmente opaco y totalmente transparente), puedes usar un descarte de texel. GL_DISCARD creo que era. Que consume mucho menos que el alpha. Ideal para colorkeys.

Aunque en tu caso, siendo una sombra, supongo que tendrá los bordes con degradado en alpha, así que mejor usar alpha blending.

Ah, y no te olvides de desactivar la iluminación. Y otra cosa importante, puede que necesites activar el "CLAMP" de texturas sino quieres que en los bordes te salgan cosas raras.

Esto es todo lo que hago yo en antes de dibujar en 2d (lo siento, D3D, pero en OGL es simétrico, he perdido el código donde lo hacía en ogl)

mInfo.mDevice->SetRenderState (D3DRS_ZENABLE, D3DZB_FALSE);
mInfo.mDevice->SetRenderState (D3DRS_ZWRITEENABLE, 0);
mInfo.mDevice->SetRenderState (D3DRS_LIGHTING, FALSE);
mInfo.mDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
mInfo.mDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);


Aparte de eso, antes tengo una función, que dependiendo de los atributos que tenga asignada la "entidad" que contiene el gráfico, elegirá dibujar algo opaco, con alpha o con descarte de texel. Y en cuanto al alpha, usando diferentes efectos también, etc.
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!






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.