2009-10-15 14 views
6

He estado usando OpenGL ES 1.1 en el iPhone durante 10 meses, y en ese momento hay una tarea aparentemente simple que no he podido hacer: descifrar programáticamente un objeto texturizado. Para simplificar: cómo puedo desvanecer alfa, bajo control de código, un triángulo 2D simple que tiene una textura (con alfa) aplicada a él. Me gustaría desvanecerlo hacia adentro/afuera mientras está sobre una escena, no con un simple fondo de color. Hasta ahora, la única técnica que tengo para hacer esto es crear una textura con múltiples copias predefinidas de la textura. (Yuck)Cómo programar alfabéticamente un objeto texturizado en OpenGL ES 1.1 (iPhone)

Como ejemplo, no puedo hacer esto usando el código de ejemplo GLSprite de Apple como punto de partida. Ya texturiza un quad con una textura que tiene su propia alfa. Me gustaría desvanecer ese objeto dentro y fuera.

Respuesta

15

Tal vez no te estoy haciendo bien, pero a mí me parece trivial y lo he estado haciendo mis aplicaciones con éxito. El camino a seguir es:

  1. permiten texturizado y todo lo necesario
  2. habilitación de la fusión: glEnable(GL_BLEND)
  3. seleccione un modo de mezcla glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)
  4. establecer un color para combinar con: glColor4f(r * a, g * a , b * a, a)
  5. llamar su geometría

La función de mezcla es para porter-duff over utilizando c premultiplicado olors/textures. El GL_TEXTURE_ENV_MODE debe establecerse en GL_MODULATE, pero ese es el valor predeterminado.

+0

Gracias a un poco de ayuda en los foros de Apple dev, conseguí este trabajo utilizando diferentes variaciones, gracias! Además, cuando traté de usar "GL \ _ONE" en lugar de "GL \ _SRC \ _ALPHA", no se desvaneció. – PewterSoft

+1

Es por eso que especifiqué explícitamente * colores premultiplicados *. Esa es la manera normal en que se manejan los colores en contextos de mapa de bits de Quartz y, por lo tanto, en texturas cargadas en GL. Si sus colores no son de primera calidad, la función de mezcla que especificó funciona como se espera (excepto para el objetivo alfa, pero eso generalmente es irrelevante). –

2

La solución de Nikolai es correcta; por favor ignora lo que dije en los foros de Apple. Dado que la textura se multiplica previamente, el color por vértice también debería ser. Debe utilizar GL_ONE en lugar de GL_SRC_ALPHA, y hacer esto:

 

            
 
  
             glColor4f(1., 1., 1., myDesiredAlpha);
            
  
glColor4f(myDesiredAlpha, myDesiredAlpha, myDesiredAlpha, myDesiredAlpha); 
Cuestiones relacionadas