2010-03-07 4 views
2

Quel glBlendFunc devrais-je utiliser pour m'assurer que l'opacité de mon dessin est toujours la même? Quand j'utilise glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) et que plusieurs images sont dessinées les unes sur les autres, le résultat est de plus en plus opaque jusqu'à ce qu'il soit complètement opaque après un certain nombre d'imga. Le plus proche est d'utiliser glBlendFunc (GL_ONE_MINUS_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA) qui maintient une opacité constante quel que soit le nombre d'images les unes sur les autres, bien qu'il y ait une légère variation d'opacité si les images se chevauchent.Opacité constante avec glBlendFunc sur iPhone

Tout autre état de rendu que je devrais envisager d'essayer? D'autres idées? Je fais une application de dessin pour mon enfant et je ne veux pas que les images (pinceau) qu'ils dessinent couvrent l'arrière-plan.

Heres le plus proche que j'ai:
ImageShask http://img43.imageshack.us/img43/5347/img0085f.png

Je veux avoir pour que la partie de chevauchement des cercles est la même couleur et l'opacité que la partie centrale du cercle.

J'utilise cocos2d iphone v. 0,99

Répondre

0

Je fini par faire ceci:

glAlphaFunc(GL_NOTEQUAL, 0); 
[sprite1.texture setAliasTexParameters]; 
[sprite1 setBlendFunc: (ccBlendFunc) { GL_SRC_ALPHA, GL_ZERO }]; 

puis, quand je dessine à mon CCRenderTexture, j'activer test alpha, visitez mon sprite pinceau puis désactiver alpha test.

2

Draw (sans transparence) dans un renderbuffer, puis utilisez l'image résultante comme une texture sur un quad partiellement transparent dans la scène principale.

Voici la méthode pour pré-RBO OpenGL, mais pas sûr si votre appareil le supportera, vous devrez peut-être le convertir pour utiliser RBOs.

  • assurez-vous de choisir un format d'affichage ayant au moins un tampon AUX
  • glGenTextures d'affecter un identifiant de texture
  • glPushAttrib (GL_COLOR_BUFFER_BIT)
  • glDrawBuffer (AUX0) pour diriger le rendu à une image hors-écran
  • glReadBuffer (AUX0)
  • glCopyTexSubImage2D pour mettre l'image en une texture
  • glPopAttrib (GL_COLOR_BUFFER_BIT) à restaurer le réglage du tampon de tirage
  • glEnable (Texture_2D)
  • glBindTexture
  • glBegin (QUAD)
  • glColor (100% RVB, alpha partielle)
  • glTexCoord (quatre fois)
  • glVertex (quatre fois)
  • glEnd

note que vous pourriez être en mesure de réutiliser la même texture pour cadre multiple s sans avoir à le rendre à chaque fois, vous pouvez également effectuer une rotation ou un étirement en utilisant de manière créative la texture coordonnée au mappage de quatre sommets.

+0

Une chance de code?Je ne comprends pas très bien ce que vous dites. – jjxtra

+0

Malheureusement, je n'ai pas la permission de publier le code source que j'ai (il utilise une ancienne version d'OpenGL sans rendre les objets de rendu, mais l'idée est la même) mais c'est presque la même chose que le double buffering. Je vais ajouter les étapes à ma réponse. –