2017-02-12 10 views
0

J'essaye de rendre un modèle en OpenGL. Je suis le jour 4 de C++ et OpenGL (Oui, j'ai appris cela rapidement) et je suis un peu arrêté avec les textures.Comment rendre mon objet transparent mais montrer la texture?

J'ai un peu de mal à faire fonctionner mon alpha de texture. Dans cette image, j'ai ce personnage de Spiral Knights. Comme vous pouvez le voir sur le dessus de sa tête, il y a ces parties blanches. Spiral Knights character with no transparency

J'ai Blending activé et ma fonction de mélange mis à glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Ce que je suppose ici, et c'est la raison pour laquelle je pose cette question, est que la transparence de la texture est travail, mais le des triangles derrière la texture sont encore visibles. Comment puis-je rendre ces triangles invisibles tout en montrant ma texture?

Merci.

+1

Il n'y a pas de "triangles derrière les textures". GL ne dessine pas de textures, il dessine des primitives. On ne sait pas exactement ce qui se passe exactement (ce que les valeurs d'akoha ont pour votre texture, comment vous combinez la texture à la couleur finale du fragment, et ainsi de suite). Vous devez également être conscient que le mélange nécessitera de dessiner les primitives dans le bon ordre. Dans ce cas particulier, vous pourriez même être en mesure de contourner ce problème en n'utilisant pas de fusion, mais en éliminant simplement en fonction de l'alpha. – derhass

+0

Vous dites _ "juste en rejetant basé sur alpha." _ - J'ai fait quelques recherches sur le rejet et tel, mais d'après ce que j'ai lu, il peut être un peu lent. Y a-t-il une autre méthode? J'ai fait un peu de googling pour des méthodes alternatives et j'ai activé le test alpha, puis j'ai défini la fonction alpha sur 'glAlphaFunc (GL_GREATER, 0.0);' mais cela ne semble pas fonctionner. –

+0

le test alpha est déprécié. approche moderne est jeter dans le shader. ce que «lent» signifie vraiment dans ce contexte est difficile à dire à l'avance. vous pourriez revenir à un test de profondeur tardive, et vous obtenez un certain degré de flux de contrôle non uniforme. Cependant, vous gagnez l'indépendance de commande en retour. – derhass

Répondre

0

Il y a deux choses importantes à faire lors de l'utilisation de mélange:

  1. Vous doit primitives de tri arrière vers l'avant et rendre dans cet ordre (ordre de transparence indépendant équarrisseurs à base de tampon de profondeur est encore un cours sujet de recherche). Lorsque vous utilisez des textures pour contrôler le canal alpha, vous devez écrire un shader qui obtient en quelque sorte les valeurs alpha de la texture transmises à la couleur du fragment résultant, ou - si vous utilisez le pipeline à fonction fixe - vous devez utiliser GL_MODULATE texture env, ou GL_DECAL avec la valeur alpha de couleur primitive définie sur 0, ou utilisez GL_REPLACE.

+0

Quant à la deuxième partie de la tâche # 2, je sais que 'glTexEnvi' prend 3 arguments. Après avoir lu [cette page] (https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTexEnv.xml) je suis allé de l'avant et j'ai essayé de faire ce que vous avez dit sur la base des informations de cette page. J'ai mis mon format interne à GL_RGBA (dans la fonction 'glTexImage2D') et j'utilise' glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); ', mais cela ne semble pas fonctionner. Est-ce que je manque quelque chose? –

+0

@XantheDragon: Difficile à dire sans voir votre code. – datenwolf