Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Cuestion Simplisima De Blending En Opengl

Iniciado por DraKKaR, 08 de Agosto de 2003, 12:41:03 AM

« anterior - próximo »

DraKKaR

 ahi va: cada frame ejecuto esto (nada mas):


glBlendFunc(GL_ONE,GL_ZERO);    

glEnable(GL_BLEND);

glBegin(GL_TRIANGLES);        
 glColor4f(1.0f,0.0f,0.0f,0.0f);    
 glVertex3f( 0.0f, 1.0f, 0.0f);    
 glColor4f(0.0f,1.0f,0.0f,1.0f);    
 glVertex3f(-1.0f,-1.0f, 0.0f);    
 glColor4f(0.0f,0.0f,1.0f,0.5f);    
 glVertex3f( 1.0f,-1.0f, 0.0f);    
glEnd();          


glBlendFunc(GL_DST_ALPHA,GL_ZERO);
glColor3f(1,1,1);
glBegin(GL_TRIANGLES);        
 glVertex3f( 0.0f, 1.0f, 0.0f);    
 glVertex3f(-1.0f,-1.0f, 0.0f);    
 glVertex3f( 1.0f,-1.0f, 0.0f);    
glEnd();      
            


La cuestion es ke tras ejecutar eso se me ve un triangulo blanco. Pero, en realidad no deberia verse un triangulo donde cada pixel blanco estuviera multiplicado por el alpha del anterior triangulo? es decir, que se viera un degradado de gris?

Storm

 Varias cosas aunque no lo pueda asegurar:

Segun el libro "Programacion en OpenGL" en el apartado de mezclas pone
CitarLos argumento por defecto de glBlendFunc son GL_ONE y GL_ZERO
parece ser que no hace falta esto.

¿No deberia llamarse glEnable(GL_BLEND); antes de glBlendFunc?

Segun el mismo libro
CitarGL_DST_ALPHA: El color de origen se multiplica por el valor alfa de destino. Microsoft OpenGL no lo soporta.
Lo que da que pensar en que version de OpenGL programas, la que viene por defecto en el win (1.1) o una actualizada (1.4) (crao k una actualizada por k si no no podrias usar dot3 en el otro topic)

¿Y poniendo el 2o glBlendFunc(GL_ONE,GL_DST_ALPHA); ?

¿El formato de pixel del contexto de dibujo es RGBA??

Si se me ocurre algo mas lo pongo. Suerte

DraKKaR

 
Citar¿No deberia llamarse glEnable(GL_BLEND); antes de glBlendFunc?

Si, pero en este caso da igual.. sigue sin funcionar de todos modos.

Citar
GL_DST_ALPHA: El color de origen se multiplica por el valor alfa de destino. Microsoft OpenGL no lo soporta.
Lo que da que pensar en que version de OpenGL programas, la que viene por defecto en el win (1.1) o una actualizada (1.4) (crao k una actualizada por k si no no podrias usar dot3 en el otro topic)

Puede ke el renderer de microsot por software no lo soporte, peor una vez te instalas los drivers de la tjta grafica y lo ejecutas por hardware, todos los modos de blending deberian estar soportados, no? (tengo una GeForce2)


Citar¿Y poniendo el 2o glBlendFunc(GL_ONE,GL_DST_ALPHA);

No tiene nada que ver. esa funcion multiplicaria el color de destino por el color de destino y se lo sumaria a lo que vas a pintar. Nada que ver, yo quiero glBlendFunc(GL_DST_ALPHA,GL_ZERO);



Citar¿El formato de pixel del contexto de dibujo es RGBA??

Si, lo se porque la clasica transparencia con glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA) SÍ funciona.


Alguien sabe que pasa aqui?

Haddd

 Tengo entendido que el Alpha en destino no se soporta por la mayoría de tarjetas. Por ello no puedes utilizar el color Alpha que está grabado en el BackBuffer. En DX hay un flag que te indica si es posible realizar comprobaciones sobre el BackBuffer. Míralo en OGL.


DraKKaR

 Gracais Haddd, esa seria la unica explicacion de porque no funciona la cosa. De todas formas si fuera asi seria una mierda, tengo una GeForce2 y creo que esos drivers deberian poder ejecutar cualkier funcion de blending. Ademas, lo de usar el alpha almacenado en el backbuffer lo he sacado de el articulo de Ron Frazier sobre Iluminacion por pixel, que hace multiplicaciones de intensidad en el alpha unicamente, y ese articulo esta enfocado a hacer que funcione en tarjetas geforce 2 o menos.

Mas sugerencias?

DraKKaR

 Vale, ya me funciona. El problema estaba en que, a la hora de hacer el pixelformat no le decia nada sobre el alha buffer. Creia ke simplemente reservando 32 bits de color era suficiente, pero no es asi. El problema esta en que si no reservas espacio en el alpha buffer, no se actualiza el valor alpha del back buffer (por eso siempre estaba a 1). Mucha gente a kien he preguntado ha tenido el mismo fallo: no reservar nada en el alpha buffer. No creia ke fuera un problema de este tiop porque las transparencias normales del tipo (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) funcionaban bien. Pero eso es porque no tienen que almacenar nada de alpha en el back buffer.
Gracias a todos por responder.






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.