8
votes

Utiliser Alpha de la texture pour dessiner de la couleur unie

Comment puis-je utiliser OpenGles 1.1 (iPhone) pour dessiner une texture, mais seulement utiliser l'alpha pour dessiner une certaine couleur?

Le résultat doit être le même masque alpha de la texture d'origine, avec une seule couleur unie à l'intérieur au lieu des couleurs d'origine.

J'utilise GLDRAWARRAIS avec GLCOORDOPERER et GLVERXPointer .

Je pense faire deux passes, une avec la texture et une avec une couleur unie à ce sujet. Je n'arrive tout simplement pas de trouver l'invert de Glblendfunc (GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); .

Edit: Après plus de choses en regardant, je pense que cela devrait être possible d'utiliser avec Gltexenvf . C'est juste une question de trouver les bons arguments.


1 commentaires

J'aimerais que ce soit en relation avec Python, j'aurais des réponses à Gazillion.


3 Réponses :


2
votes

Si vous pouvez utiliser OpenGL ES 2.0, vous pouvez le faire avec un shader de fragment personnalisé. Si vous utilisez un cadre construit sur 1.1 ou ciblant des périphériques qui ne supportent pas 2.0, cela ne sera pas beaucoup d'aide. Mais si vous le pouvez, c'est ainsi que vous le faites:

uniform lowp sampler2D sampler; // which texture unit to use
uniform lowp vec4 solidColor;

varying highp vec2 fragmentTexCoord;

void main()
{
    // Get the color with an alpha of zero
    vec4 color = vec4(1,1,1,0) * solidColor;
    // Get the alpha from the texture, zero the r,g,b components
    vec4 alpha = vec4(0,0,0,1) * texture2D(sampler, fragmentTexCoord);
    // their sum is the solid color with the alpha mask of the texture
    gl_FragColor = color + alpha;
}


3 commentaires

Merci pour la suggestion. Je ne suis pas trop sûr si je peux utiliser des shaders. N'a-t-il pas un moyen d'utiliser l'inverse de Glblendfunc (GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); pour faire ça?


Cette réponse indique que Opengles 1.1 ne prend pas en charge les shaders personnalisés: Stackoverflow.com/questions/543948/OPENGL-ES-1-X-Shaders/... .


Désolé, je modifierai la réponse, même si ce n'est pas utile pour vous, pourrait être de la préservation de quelqu'un d'autre qui fait une recherche.



0
votes

Glblendfunc (Source_Factor, Dest_Factor) CODE> Traduit sur: XXX PRE>

SO GLBLENDFUNCUNC (GL_ZERO, GL_ONE_MINUS_SRC_ALPHA) CODE> est: P>

dest= source*source.alpha + dest


0 commentaires

8
votes

Comme indiqué, Gltexenv est la voie à suivre.

Pour remplacer les composants RVB de votre texture et garder son alpha intacte, vous pouvez essayer quelque chose comme ceci (ce code utilise rouge comme couleur de remplacement): P>

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_TEXTURE);   
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);


7 commentaires

Merci pour cette réponse vraiment informative! J'ai dû changer gl_texture_0 à gl_texture0 pour le rendre compilé et ajouter gl_texenvi (gl_texture_env, gl_texture_env_mode, gl_moduler); après le dessin pour faire le dessin reste du travail de rendu. Maintenant, la forme est correctement dessinée, mais toujours en utilisant le blanc comme une couleur. Pourrait-il être lié aux changements que j'ai faits?


Je ne pense pas que vos modifications soient la raison de votre problème et oui, vous devez ajouter GLTEXENVI (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULE); après le dessin pour revenir au mode de texturation par défaut. Je n'ai aucune idée claire sur la raison pour laquelle vous obtiendrez des résultats blancs ... Avez-vous correctement ajouté le GLCOLOR4F () comme décrit dans l'exemple?


Oui, GLCOLOR4F est appelé à la même position que dans votre exemple de code.


Hummm ... Vous voudrez peut-être vérifier que l'unité de texture 1 est correctement désactivée en appelant Glactivetexture (GL_Texture1); gldisable (gl_texture_2d); Vérifiez également que votre mélange est activé et cette fonction de mélange est définie comme ceci: GLBLENDFUNCUNC (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);


J'ai posté une extrait de code que vous pouvez utiliser pour mettre à jour l'échantillon GLSPRITE fourni avec Xcode et cela fera ce que vous voulez. Tout ce que vous avez à faire est d'éditer eAglView.m pour définir correctement la fonction de mélange dans setupview et remplacer le dessin avec celui fourni sur .org / ppko


Merci beaucoup. Prenez votre bounty!


Merci! Faites-nous savoir si vous trouvez la raison pour laquelle vous avez des résultats blancs ... je suis vraiment curieux.