IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

Texture à transparence variable


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Par défaut Texture à transparence variable
    Bonjour,

    Je cherche actuellement a afficher une image qui contient différents dégradés sur la couche alpha.

    Seulement voila. J'ai un problème :
    Si j'utilise le blending comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE);
    A ce moment là, c'est tout mon objet qui est transparent de manière uniforme.

    Si j'utilise ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glEnable(GL_ALPHA_TEST) ;
    glAlphaFunc (GL_GREATER, 0.1 ) ;
    A ce moment là, des zones de ma textures sont soit transparente soit non.

    La question fatidique est donc la suivante : Est ce qu'il existe un moyen d'afficher une texture pour tous les niveaux de transparence de mon image de base ?

    Merci de votre aide

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Essaye plutôt comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    Tu devrais prendre un moment et lire complétement la doc de ces fonctions pour comprendre le pourquoi du comment, plutôt que d'y aller à tâtons

  3. #3
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 162
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glEnable(GL_ALPHA_TEST) ;
    glAlphaFunc (GL_GREATER, 0.1 ) ;
    Ca sert plustot pour rendre certaines parties des polygones commpletement invisibles... Par exemple dans le rendu des arbres "bilbordés"

  4. #4
    Membre éclairé Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Par défaut
    Citation Envoyé par Laurent Gomila Voir le message
    Essaye plutôt comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    Tu devrais prendre un moment et lire complétement la doc de ces fonctions pour comprendre le pourquoi du comment, plutôt que d'y aller à tâtons
    La doc sur GL_BLEND, je l'ai vraiment bien lu pourtant. J'ai egalement suivi le tutos ici : http://nehe.developpez.com/tutoriel/08-transparence/. Je comprend bien l'effet que devrais avoir le comportement que tu annonce :
    - dans le cas d'un alpha de valeure 0.8 sur la source, on mélange le pixel avec 80% de la source et 20% de la destination.

    Cepandant mon résultat me donne une image totalement opaque (ou bien qui s'atténue en fonction de mon glColor4f(1.,1.,1.,attenuation)
    J'ai bien vérifié que mon image (un png ici) possède bien une couche alpha et la SFML qui génère ma texture gère bien la couche alpha également.

    Du coup je suis complètement perdu :/

    Citation Envoyé par goast Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glEnable(GL_ALPHA_TEST) ;
    glAlphaFunc (GL_GREATER, 0.1 ) ;
    Ca sert plustot pour rendre certaines parties des polygones commpletement invisibles... Par exemple dans le rendu des arbres "bilbordés"
    OK, voila un truc que j'avais bien compris.

  5. #5
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 162
    Par défaut
    t'as pas fais un glEnable(GL_COLOR_MATERIAL)?
    ca fait du b****l des fois.

  6. #6
    Membre éclairé Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Par défaut
    Non je n'ai pas utilisé cela. J'ai tout de meme essayer de le désactivé mais rien n'y fait :/

  7. #7
    Membre éclairé Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Par défaut
    Apres moultes éssais, je me suis aperçu d'un comportement bizard.

    En effet ma texture est utilisée pour un système de particules.

    Et la, miracle, je me rend compte que ma texture de particule est bien trensparente comme je le souhaite avec nimporte quel objet de ma scene mais par contre elle sont opaques entre elles :/

    pour info, mon code d'affichage ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    	if (textureId != 0)
    	{
    		glEnable(GL_TEXTURE_2D);
    		TextureManager::GetInstance().BindTexture(textureId);
    	}
     
    	glEnable(GL_BLEND);
    	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
     
    	glBegin(GL_QUADS);
    	for (vector<Particle *>::iterator it = particles.begin();it != particles.end();)
    	{
    		if (!(*it)->IsAlive())
    		{
    			delete *it;
    			it = particles.erase(it);
    		}
    		else
    		{
    			(*it)->Draw(p_dt, *this);
    			it++;
    		}
    	}
    	glEnd();
     
    	glDisable(GL_BLEND);
     
    	if (textureId != 0)
    	{
    		glDisable(GL_TEXTURE_2D);
    	}
    Celà vous donne une idée ?

  8. #8
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    Salut, je n'ai pas regardé en détails, mais puisque tu utilises le blending pour la transparence tu ne pourras voir à travers tes particules que les objets placés derriere ET DESSINÉS AVANT.

    Là tu dessines ta scene, puis tes particules, donc tu peux voir ta scene sans probleme. Pour les particules, à moins de les trier et de les afficher dans l'ordre (ce qui me parait extrêmement lourd pour un generateur de particules), il n'y a pas grand chose à faire...

  9. #9
    Membre éclairé Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Par défaut
    Merci !!!!!!

    Tu a mis le doigt dans le mille !

    Un petit :
    glDisable(GL_DEPTH_TEST);

    Et tout rentre dans l'ordre. Juste faire gaffe à l'ordre d'affichage car du coup mes particules passent devant tout mais ca c'est quelque chose que je peux maitriser

    Merci encore !

  10. #10
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    Effectivement, je n'avais pas pensé à cette solution quand même bien plus pratique qu'un tri de bourrin Si ca ne pose pas de problème pour le reste de ton affichage c'est parfait!

  11. #11
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut
    plutot que de désactiver le test de profondeur, changes ta méthode de blending

    à ma connaissance, pour un moteur de particules, on utilise habituellement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glBlendFunc(GL_SRC_ALPHA,GL_ONE);
    ça devrai aller vite à tester
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  12. #12
    Membre éclairé Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Par défaut
    Oui, le résultat est plus sympa a regarder Par contre je suis tout de même obligé de désactivé le test de profondeur sinon le problème de base persiste.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [OpenGL/GLSL] Texture - Transparence non voulu
    Par AuraHxC dans le forum OpenGL
    Réponses: 19
    Dernier message: 25/01/2010, 16h42
  2. [C#] Sauvegarde de texture dans un fichier + transparence
    Par Harry_polin dans le forum DirectX
    Réponses: 13
    Dernier message: 23/07/2005, 18h12
  3. transparence texture
    Par ptidrone dans le forum DirectX
    Réponses: 10
    Dernier message: 09/07/2004, 17h59
  4. pb de transparence/texture/sprite
    Par Fikus dans le forum DirectX
    Réponses: 6
    Dernier message: 15/05/2004, 22h38
  5. Texture Transparence
    Par Cartman dans le forum DirectX
    Réponses: 1
    Dernier message: 02/03/2004, 22h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo