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 :

Depth en openGL


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Par défaut Depth en openGL
    Bonjour,
    je souhaite faire un cross billboard.
    Tout marche, sauf un problème de transparence que je n'arrive pas à régler.

    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
    32
    void drawGrass()
    {
    	glEnable(GL_BLEND);
    	glEnable(GL_DEPTH_TEST);
    	glEnable(GL_ALPHA_TEST);
    	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ; 
    	//glAlphaFunc(GL_EQUAL, 1);
    	//glDepthFunc(GL_LESS);
     
      if(programobject!=0){
        glUseProgramObjectARB(programobject);
      }
      glActiveTexture(GL_TEXTURE0);
      TextureManager::Inst()->BindTexture(grassTex1);
      glActiveTexture(GL_TEXTURE1);
      TextureManager::Inst()->BindTexture(grassTex1_alpha);
      glUniform1i(glGetUniformLocationARB(programobject, "grass"), 0);
      glUniform1i(glGetUniformLocationARB(programobject, "grass_alpha"), 1);
     
      float w=4.f;
      float h=2.f;
      glPushMatrix();
      for(int i=0; i<3; ++i)
      {
    	  glRotatef(360./3., 0., 1., 0.);
    	glTranslatef(0., 0., w/3.);
    	drawGrassBillboard(w,h);
      }
      glPopMatrix();
     
    	glUseProgramObjectARB(0);
    }


    Je pense que c'est un probleme de paramètres glEnable / gl***func...

    note:
    near/far = 0.1 / 100.
    Les enable sont là pour le test, je les déplacerai dans le init quand ça fonctionnera

    Merci de votre aide!

  2. #2
    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
    Bonjour,

    pour commencer, pourquoi utiliser l'alpha-test? Pour des billboards, le blending classique suffit.v
    Bref je pense que vous pouvez supprimer

    glEnable(GL_ALPHA_TEST);
    Ensuite...d'apres le srcreenshot et le code...vous faite un billboard à 3 côtés? Normalement 2 suffisent, vous faites 2 quads qui se croisent (une croix, vu de dessus) et c bon...

    Mais bref, j'ai l'impression que c'est un probleme d'ordre de dessin avec le blending: la transparence a travers un objet (le blending) ne marche que si les objets en arriere plan on été dessinés avant, ce qui ne peut pas etre le cas partout sur votre billboard (2 Quad qui se croisent....a moins de les subdiviser, il yaura toujours la moitié d'un quad derriere l'autre et vice versa).

    Hum j'espere que ca reste a peu près clair....

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Par défaut
    La technique du cross billboard en étoile pour l'herbe est normale et connue,
    c'est bien trois que je veux et non pas deux.
    (http://http.developer.nvidia.com/GPU...gems_ch07.html)
    Personne n'a jamais signalé ce genre de problème avec cette méthode, le depth test se fait pixel par pixel donc il ne devrait pas dépendre de l'ordre, mais je n'arrive pas à paramétrer ça correctement...

    J'ai ajouté le alpha test en désespoir de cause, ne sachant plus quoi mettre...

    Si quelqu'un a une meilleure idée?

  4. #4
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 408
    Par défaut
    pour avoir une transparence correcte, il faut que les triangles soient triés en fonction de la profondeur par rapport à l'observateur, le fait que les gens ne signalent pas le problème c'est que ça en est pas un, c'est une technique à connaitre pour faire un rendu correct de "trucs" transparents.

    Citation Envoyé par de la page du site de nvidia
    Figure 7-4 Grass Objects

    If we set these grass objects quite close together in a large area, as shown in Figure 7-5, sort them back-to-front at runtime, use alpha blending, and enable z-testing/writing in the draw call, then the impression of a naturally and thickly grown meadow appears.
    une autre technique disponible sur les hardware récent serait de faire de l'oit.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Par défaut
    merci pour ta réponse,
    cela signifie qu'on ne peut donc pas croiser les triangles?
    L'un doit être devant l'autre...

    C'est pourtant ce que je voyais sur la figure 7.4 à droite...

    Donc un bloc d'herbe comme la figure 7.4 à gauche = 6 quads ?!
    Ca va faire lourd pour ma pelouse...

    Sinon pour le tri, il y a une fonction openGL pour le faire ou bien ça se fait à la main?

    Merci!

  6. #6
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 408
    Par défaut
    il faut bien faire gaffe à la texture utiliser, une texture avec des brins d'herbes bien verticaux, même si le croisement de polygones n'est pas conseillé, dans ce cas de figure, l'illusion d'étendue d'herbes restent assez réaliste, il ne faut pas utiliser n'importe quelle texture, voilà tout ^^

Discussions similaires

  1. [OpenGL ES] Récupérer la profondeur (depth)
    Par gabrielS dans le forum Android
    Réponses: 3
    Dernier message: 06/09/2012, 10h53
  2. Depth buffer dans texutre ( opengl )
    Par Rastacouéne dans le forum OpenGL
    Réponses: 43
    Dernier message: 22/07/2008, 20h22
  3. OpenGL et *.3ds
    Par tintin22 dans le forum OpenGL
    Réponses: 4
    Dernier message: 06/05/2002, 13h51
  4. OpenGL ou DirectX
    Par Nadir dans le forum DirectX
    Réponses: 6
    Dernier message: 02/05/2002, 12h48
  5. Opengl -- Les surfaces
    Par Anonymous dans le forum OpenGL
    Réponses: 2
    Dernier message: 02/05/2002, 10h14

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