2010-06-25 9 views
2

Je suis un démarreur de la programmation Iphone opengl ES. J'ai deux textures, la première est l'arrière-plan et occupe tout l'écran. J'imprime la deuxième image sur la première image mais le fond blanc de la deuxième image couvre une partie de l'arrière-plan. Je veux que l'arrière-plan soit visible là où l'image de premier plan n'a pas de couleur (ou de blanc). Je n'arrive pas à comprendre comment utiliser correctement glBlendFunc.OpenGL: superpose une texture sur une autre et supprime le fond blanc

avant d'imprimer la seconde image J'utilise fusion avec ce qui suit:

glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f (1,0f, 1,0f, 1,0f, 1,0f);

Images à: http://www.flickr.com/x/t/0097002/photos/vjv2010/

+0

assurez-vous d'appeler glEnable (GL_BLEND) avant de rendre quoi que ce soit. En outre, sauf si votre texture est * semi * transparente, vous pouvez utiliser le test alpha pour découper les pixels au lieu du mélange alpha. Le test alpha sera plus rapide. – SigTerm

+0

@SigTerm: J'y pensais aussi, mais Apple documente que cela peut nuire à la performance. Peut-être que le mélange est plus rapide sur iPhone? – Stringer

+0

@Stringer Bell: Oui, le mélange est assez lent (vous pouvez même mettre PC à genoux avec un mélange alpha excessif), mais pour utiliser alpha, vous devrez soit activer alphaBlend (glEnable (GL_BLEND)), soit activer alphaTest (glEnable (GL_ALPHA_TEST)). Sinon, le canal alpha n'aura aucun effet. Si vous n'avez pas besoin de surfaces semi-transparentes, le test alpha est tout ce dont vous aurez besoin. Il y a un moyen de simuler la semi-transparence avec alphatest + dithering ou glPolygonStripple, mais un petit écran (iPhone) il est forcément très moche. – SigTerm

Répondre

0

Je veux que le fond soit visible où l'image de premier plan n'a pas de couleur (ou blanc).

Vous avez deux choix, le plus simple est d'utiliser des tests alpha et ajouter un canal alpha pour votre image de premier plan afin que chaque pixel blanc (ou pas de zones de couleur) a une valeur particulière, allons dire 0.0f et tous les autres 1.0f.

Puis lors du rendu au premier plan vous permettent test alpha avec glEnable(GL_ALPHA_TEST) et régler la fonction alpha avec glAlphaFunc(GL_GREATER, 0.5f) Cette acceptera/dessiner seulement des fragments qui ont une valeur alpha supérieure à 0.5f et jeter/pas tirer tous les fragments qui ont une valeur alpha moins que 0.5f.

Le deuxième choix consiste à utiliser le fondu comme vous l'avez fait, mais vous devrez également ajouter un canal alpha supplémentaire à votre premier plan et définir correctement glBlendFunc.

Plus ici: http://iphone-3d-programming.labs.oreilly.com/ch06.html