Changer la texture d'opacité dans OpenGL
C'est, espérons le, une question simple: j'ai une texture OpenGL et que vous souhaitez être en mesure de changer son opacité, comment dois-je faire? La texture a déjà un canal alpha et le mélange fonctionne bien, mais je veux être en mesure de diminuer l'opacité de l'ensemble de la texture, à s'estomper dans l'arrière-plan. J'ai bricolé avec glBlendFunc
, mais avec pas de chance – il semble que j'aurais besoin de quelque chose comme GL_SRC_ALPHA_MINUS_CONSTANT
, ce qui n'est pas disponible. Je suis en train de travailler sur l'iPhone, avec OpenGL ES.
OriginalL'auteur zoul | 2008-11-03
Vous devez vous connecter pour publier un commentaire.
Je n'ai aucune idée sur OpenGL ES, mais dans la norme OpenGL, vous définissez l'opacité par la déclaration d'une couleur de la texture avant de l'utiliser:
L'exemple serait de vous donner alpha de 50% sans affecter la couleur de la texture de vos cheveux. En ajustant les autres valeurs, vous pouvez déplacer la texture trop de couleur.
Eh bien cela dépend de l'application, mais je voudrais utiliser généralement: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Cela fonctionne parce que la texture par défaut de l'environnement est définie à GL_MODULATE
OriginalL'auteur Dan
Utiliser une texture combiner. Définir la texture de la scène pour faire un
GL_MODULATE
de texture et de couleur constante. Puis changement de la constante de couleur à partir de votre code (glTexEnv
,GL_TEXTURE_ENV_COLOR
).Cela devrait venir en tant que "libre" en termes de performances. Sur la plupart (si pas tous) des puces graphiques de combiner les opérations de prendre le même nombre de GPU cycles (généralement 1), donc juste à l'aide d'un de textures et de faire une moduler le fonctionnement (ou de toute autre opération) est exactement le même coût.
OriginalL'auteur NeARAZ
Merci à tous pour les idées. J'ai joué à la fois avec glColor4f et glTexEnv et enfin me suis forcé à lire le glTexEnv page de manuel attentivement. Le manuel dit que dans le GL_MODULATE la texturation de mode, la couleur résultante est calculée en multipliant le nouveau fragment par la texture de la couleur (C=Fc×Ct), en va de même pour l'alpha. J'ai essayé glColor4f(1, 1, 1, opacité) et qui n'ont pas de travail, mais le passage de l'opacité voulue dans toutes les quatre arguments de l'appel a fait le tour. (Toujours pas sûr de savoir pourquoi.)
Oui, comme il l'a résolu le problème que j'ai eu. Se sentir libre d'être en désaccord 🙂
Vous mettez quelque chose de mal avec les textures. Ce que Dan a répondu œuvres et de la logique, votre "solution" est un hack.
C'est normal, si vous alphablend votre couleur en arrière-plan ou alphablend avec GL_ONE paramètre de la source alpha, au lieu de GL_SRC_ALPHA. Dans ce cas, vous n'auriez pas besoin de changer tous les composants de la couleur.
OriginalL'auteur zoul
En gros, vous avez deux options: utiliser glTexEnv pour votre texture avec GL_MODULATE et de spécifier la couleur à l'aide de glColor4* et l'utilisation d'un non-opaque niveau pour le canal alpha. Notez que glTexEnv doit être délivrée qu'une seule fois, lors du premier chargement de la texture de vos cheveux. Ce scénario ne fonctionnera pas si vous spécifiez les couleurs dans votre vertex-attributs. Ceux-ci vont à savoir remplacer tout glColor4* couleur vous pouvez définir. Dans ce cas, vous pouvez recourir à l'une des 2 options: l'utilisation de la texture multiplexeurs (rubrique avancé, pas agréable à utiliser en fixe pipeline), ou "manuellement" changer la couleur de sommet de l'attribut de chaque vertex (peut être indésirable pour les grandes mailles).
OriginalL'auteur zmippie
La façon la plus simple est de changer la texture de la valeur alpha à la volée. Puisque vous dites OpenGL sur la texture à un certain point, vous aurez le bitmap en mémoire. Donc suffit de relier la texture à la même identifiant de la texture. Dans le cas où vous ne l'avez pas en mémoire, (en raison de contraintes d'espace, puisque vous êtes sur ES), vous pouvez récupérer la texture d'un tampon de nouveau, à l'aide de glGetTexImage(). C'est le propre solution.
Sauvegarde/récupération opérations sont un peu coûteux, cependant, de sorte que vous pourriez vouloir une autre solution. Penser à ce sujet, vous pourriez être en mesure de travailler avec la géométrie derrière votre la géométrie de l'affichage de la texture de vos cheveux ou simplement de travailler sur le matériau ou la couleur de la géométrie qui détient la texture. Vous aurez probablement besoin de quelques additif mélange de l'arrière de la géométrie. À l'aide d'un glBlendFunc de
vous pourriez peut-être "facilement" et - plus important, à moindre coût - pour obtenir l'effet souhaité.
OriginalL'auteur mstrobl
Très probablement, vous êtes à l'aide de cg pour obtenir votre image dans une texture. Lorsque vous utilisez le cg, l'alpha est prémultipliée, donc pourquoi vous devez utiliser l'alpha pour rgba de la color4f func.
OriginalL'auteur
Je soupçonne que vous avez eu un fond noir, et donc par la diminution de la quantité de chaque couleur, vous a effectivement été la décoloration de la couleur au noir.
OriginalL'auteur Brett Lawson