Comment rendre une texture partiellement transparente?

13

Bonjour StackOverflow, j'ai un petit problème en ce moment car je n'arrive pas à trouver un moyen de rendre une partie d'une texture de manière transparente avec openGL.

Voici mon réglage: j'ai un quad, représentant un mur, recouvert de cette texture (converti en PNG pour le téléchargement). Évidemment, je veux que le mur soit opaque, à l'exception des vitres. Il y a un autre avion derrière le mur qui est censé montrer un paysage. Je veux voir le paysage de derrière la fenêtre. Chaque texture est un TGA avec canal alpha.

Le "paysage" est rendu d'abord, puis le mur. Je pensais que ce serait suffisant pour obtenir cet effet mais apparemment ce n'est pas le cas. La partie de la fenêtre censée être transparente est noire et le paysage n'apparaît que lorsque je passe devant le mur.

J'ai essayé de jouer avec GLBlendFunc () après l'avoir activé mais cela ne semble pas faire l'affaire.

Suis-je en train d'oublier une étape importante?

Merci :)

mégamoustache
la source
Bonjour, bienvenue chez gdse. J'ai fait peu de modifications, nous n'aimons pas beaucoup placer des balises dans les en-têtes de questions. Et à votre question. Utilisez-vous un pipeline fixe ou vos propres shaders?
Notabene
Merci pour la retouche. Je ne suis pas sûr de la signification de "pipeline fixe" mais je construis chaque sommet manuellement et je n'utilise aucun shader. Si cela importe, je n'utilise pas la dernière version d'OpenGL car c'est pour un devoir scolaire (je pense que c'est OpenGL 3).
megamoustache
Ce serait formidable si vous pouviez inclure l'image dans votre question. Il semble avoir disparu de son emplacement d'origine.
OR Mapper

Réponses:

19

En plus de tout ce que vous avez déclaré (textures avec canaux alpha, dessin du paysage avant de dessiner le mur + la fenêtre), vous devez également faire deux choses supplémentaires.

Tout d'abord, vous devez activer la fonctionnalité de fusion d'OpenGL:

glEnable(GL_BLEND);

Deuxièmement, vous devez indiquer à OpenGL comment calculer les couleurs des pixels mélangés (que OpenGL appelle des "fragments", soit dit en passant). Dans ce cas, vous serez bien avec quelque chose de simple comme ceci:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Une fois le mélange activé, OpenGL combinera les couleurs des pixels en fonction des paramètres de fonction que vous lui donnez dans glBlendFunc. Plus précisément, il fera "source.color * source.alpha + destination.color * (1-source.alpha)", où "source" est la texture que vous effectuez actuellement et "destination" est la couleur déjà dans le framebuffer (le paysage). Ainsi, partout où votre canal alpha est blanc, vous obtiendrez la couleur du mur, et partout où le canal alpha sera noir, vous obtiendrez la couleur paysage. Si le canal alpha est gris, vous obtiendrez un fondu enchaîné entre les deux couleurs.

Si votre fenêtre est entièrement transparente, il existe d'autres façons de le faire, où l'ordre dans lequel vous dessinez les deux polygones n'est pas important, mais cela commence à entrer dans des concepts plus avancés tels que les seuils alpha. Probablement pas nécessaire pour votre situation actuelle.

Trevor Powell
la source