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 :

Problème de blending dans mon motion blur


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 9
    Par défaut Problème de blending dans mon motion blur
    J'ai fait une classe gérant le motion blur qui fonctionne de la manière suivante: je stocke un certain nombre de rendus (les 10 derniers par exemple) dans un tableau de textures, que j'affiche à chaque frame; bien sur, j'écrase la dernière texture par la nouvelle à chaque fois, je fais une rotation circulaire quoi.
    Voici les étapes:
    - je choisis un viewport de 512*512
    - je dessine tous mes objets dans le front buffer
    - je stocke le buffer dans une texture de 512*512 à l'aide de glCopyTexImage2D
    - je reviens au viewport original
    - je choisis une projection orthogonale
    - je dessine toutes les textures de mon tableau sur des quads que je superpose en prenant bien soin de désactiver le depth_test et en mettant un alpha <1 pour chaque quad

    Voici l'image obtenue avec 1 seule image, ca semble correct (enfin il n'y a aucun effet de motion blur puisqu'il n'y a qu'une image lol):
    http://damien.rumiano.free.fr/opengl...le_texture.jpg

    Mais si j'en met plus, et donc à partir du moment où je superpose au moins 2 quads, j'obtiens des bugs sur l'objet:
    http://damien.rumiano.free.fr/opengl/trois_textures.jpg

    Encore une avec plus de quads superposés:
    http://damien.rumiano.free.fr/opengl...e_textures.jpg

    D'une manière générale, dès que je superpose un quad texturé avec un autre, j'obtiens un effet bizarre, et des couleurs pas belles.

    Si vous pensez que le code peut vous permettre de me répondre, je suis prêt à le poster, en tout cas la partie critique. Merci beaucoup

  2. #2
    Membre expérimenté Avatar de Sixissor
    Étudiant
    Inscrit en
    Février 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 206
    Par défaut
    je dessine toutes les textures de mon tableau sur des quads que je superpose
    - Tu les superposes de quelle façon ?

    - Quelle est ta fonction de blending ?

  3. #3
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 9
    Par défaut
    Voici la partie du code qui superpose les quads:
    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
    33
    34
    35
    36
    37
    38
    39
    40
     
    	glClearColor(0.0,0.0,0.0,1.0);
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
    	glViewport(offset_width,offset_height,width,height);
     
    	ViewOrtho();
     
    	// we render the previous pictures
    	glEnable(GL_TEXTURE_2D);						// Enable 2D texture mapping
    	glDisable(GL_DEPTH_TEST);						// Disable depth testing
    	glEnable(GL_BLEND);
    	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);				// Set blending mode
    	//glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
     
    	for(int i=1; i<nb_pictures; i++){
    		glBindTexture(GL_TEXTURE_2D,pictures[i]);		// Bind to the appropriate texture
    		glBegin(GL_QUADS);
    			GLfloat white[]={1.0,1.0,1.0,0.2/*2.0/nb_pictures*/};
    			glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,white);
     
    			glTexCoord2f(0,0);
    			glVertex2f(0,0);
     
    			glTexCoord2f(0,1);
    			glVertex2f(0,512);
     
    			glTexCoord2f(1,1);
    			glVertex2f(512,512);
     
    			glTexCoord2f(1,0);
    			glVertex2f(512,0);
    		glEnd();
    	}
     
    	ViewPerspective();
     
    	glDisable(GL_TEXTURE_2D);
    	glEnable(GL_DEPTH_TEST);
    	glBindTexture(GL_TEXTURE_2D,0);		// Unbind the texture
    J'ai essayé beaucoup de fonctions de blending, mais le problème est toujours le même.

  4. #4
    Membre expérimenté Avatar de Sixissor
    Étudiant
    Inscrit en
    Février 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 206
    Par défaut
    Tes étapes sur le motion blur m'ont l'air correctes à priori, et je vais te donner ma "définition" de la chose pour voir si on est d'accord sur le principe déjà.
    Rappel du principe du motion blur (grosso modo):
    Capturer l'affichage du programme au moment T pour le binder comme texture en utilisant le blending au moment T+1 sur toute la surface.
    La capture et l'affichage se font en mode ORTHO avec comme paramètres la largeur et la hauteur de la surface d'affichage.
    On est d'accord là-dessus ou pas ?
    Avoir une vision claire du problème permet de le résoudre à moitié...


    Il y a quelques défauts dans ton code.

    • J'ai pas compris pourquoi tu Bind plusieurs textures ? ... 1 seule suffit non ?
      En fait ton tableau de textures ne sert à rien, tu peux oublier.

    • Vérifie lors du texturage de la surface que tu la crée avec cette propriété:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
      Le paramètre GL_MODULATE est ici nécessaire au blending.

    • Méfie-toi de ça:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      glTexCoord2f(0,0);          glVertex2f(0,0);
      glTexCoord2f(0,1);          glVertex2f(0,512);
      glTexCoord2f(1,1);          glVertex2f(512,512);
      glTexCoord2f(1,0);          glVertex2f(512,0);
      Par défaut OpenGL spécifie les coordonnées de texture dans le sens trigonométrique, pas dans le sens horaire, donc à remplacer par ça:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      glTexCoord2f(0,0);          glVertex2f(0,0);
      glTexCoord2f(1,0);          glVertex2f(512,0);
      glTexCoord2f(1,1);          glVertex2f(512,512);
      glTexCoord2f(0,1);          glVertex2f(0,512);
      Sinon tu risques d'avoir des résultats bizarres...

    • Vérifie que si tu récupères la texture sur 'largeur' x 'hauteur' de la zone à "blurer" tu es bien en mode ORTHO avec
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      glOrtho( 0, largeur, hauteur, 0, 0, profondeur (=1 normalement));
    • Si ça marche toujours pas essaye de remplacer
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      GLfloat white[]={1.0,1.0,1.0,0.2/*2.0/nb_pictures*/};
      glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,white);
      par
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      glColor4f(1.0,1.0,1.0,0.2/*2.0/nb_pictures*/);



    Personnellement, j'aurais utilisé une méthode bien plus élégante pour faire du motion blur: j'aurais crée un shader qui s'occupe de ça en Cg.
    Toutes ces manips "chiantes" niveau software tendent à disparaitre au profit des Shaders (le GPU est au chômage sinon ).

    Bref, je ne te cache pas que j'ai passé pas mal de temps aussi à déboguer mon premier Motion Blur et je l'ai en travers de la gorge depuis...

    Bonne chance en tout cas on est là pour essayer de t'aider

  5. #5
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 9
    Par défaut
    Tout d'abord, merci de ta réponse !

    Pour ce qui est du motion blur, je pensais que l'effet serait bien meilleur en utilisant les images aux temps T-N+1, T-N, ..., T-1, T pour un affichage au temps T. En utilisant seulement les images aux temps T-1 et T pour un affichage au temps T, on obtient un motion blur quasi inexistant, non?

    Sinon, j'ai essayé à peu près tout ce que tu m'as suggéré, mais je n'arrive pas à grand chose. En fait, j'ai réalisé un test encore plus simple: je n'affiche qu'un quad sur lequel j'applique l'image courante... on peut difficilement faire plus simple! Et pourtant, en mettant un alpha=0.5 sur le quad, j'obtiens quelque chose que je ne m'explique pas: sur un cube, il semble qu'on voit les faces de derrière, alors qu'au moment de la copie du buffer, mon cube est tout ce qu'il y a de plus opaque! Je n'ai surement pas saisi le fonctionnement des alphas et du blending.
    Voila l'image:
    http://damien.rumiano.free.fr/opengl/cube.jpg

    Et le code:
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    glEnable(GL_DEPTH_TEST);
    glClearColor(0.0,0.0,0.0,1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
    glEnable( GL_BLEND );
    glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
     
    GLfloat white[]={1.0,1.0,1.0,1.0};
    glMaterialf(GL_FRONT,GL_SHININESS,100);
    glMaterialfv(GL_FRONT,GL_SPECULAR,white);
     
    glViewport(0,0,512,512);
    glutSolidCube(20.0);
     
    glBindTexture(GL_TEXTURE_2D,pictures[0]);
    glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 512, 512, 0);
     
    glClearColor(0.0,0.0,0.0,1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
    glViewport(offset_width,offset_height,width,height);
     
    ViewOrtho();
     
    glEnable(GL_TEXTURE_2D);
    glDisable(GL_DEPTH_TEST);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
     
    glBegin(GL_QUADS);
    	GLfloat white[]={1.0,1.0,1.0,0.5};
    	glMaterialf(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,white);
     
    	glTexCoord2f(0,0);
    	glVertex2f(0,0);
     
    	glTexCoord2f(1,0);
    	glVertex2f(512,0);
     
    	glTexCoord2f(1,1);
    	glVertex2f(512,512);
     
    	glTexCoord2f(0,1);
    	glVertex2f(0,512);
    glEnd();
     
    ViewPerspective();
     
    glDisable(GL_TEXTURE_2D);
    glEnable(GL_DEPTH_TEST);
    glBindTexture(GL_TEXTURE_2D,0);
    Encore merci pour vos réponses!

  6. #6
    Membre expérimenté Avatar de Sixissor
    Étudiant
    Inscrit en
    Février 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 206
    Par défaut
    Pour ce qui est du motion blur, je pensais que l'effet serait bien meilleur en utilisant les images aux temps T-N+1, T-N, ..., T-1, T pour un affichage au temps T. En utilisant seulement les images aux temps T-1 et T pour un affichage au temps T, on obtient un motion blur quasi inexistant, non?
    Hum non.
    Fait confiance a ta fonction de blending
    Mais il est vrai que plus ton image "bouge", plus le motion blur sera accentue, et vice-versa.

    je n'affiche qu'un quad sur lequel j'applique l'image courante... on peut difficilement faire plus simple! Et pourtant, en mettant un alpha=0.5 sur le quad, j'obtiens quelque chose que je ne m'explique pas: sur un cube, il semble qu'on voit les faces de derrière, alors qu'au moment de la copie du buffer, mon cube est tout ce qu'il y a de plus opaque!
    C'est normal: ta composante alpha = 0.5, donc semi-transparent.
    Si alpha = 0, ton cube est entierement transparent, et si alpha = 1, ton cube est completement opaque. Apres le blending s'effectuera selon la fonction que tu lui auras donne.

    Le blending rentre en compte avant la rasterisation du pipeline OpenGL (http://neogamedev.chable.net/images/...ationsOGL.gif)

    Donc quand tu ecris glutSolidCube(20.0) tu donnes des coordonees a OpenGL qu'il va traiter et ensuite afficher a l'ecran et "dessiner" le polygone selon la valeur du blending, etc.


    Sinon, concernant le motion blur et vu comme c'est parti, ca ne donnera surement rien. Donc si tu es un peu patient je vais (re)faire un prog OpenGL qui implemente le motion blur "le plus facilement possible". Je ferai ca ce week-end, donc je donnerai la source avant Dimanche soir... Ou avant tout depend de mon temps libre.

    ++

    PS: quand rien ne marche, restart from scratch

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

Discussions similaires

  1. Problème de concurrence dans mon updateCommand
    Par Freygolo dans le forum VB.NET
    Réponses: 7
    Dernier message: 07/06/2007, 08h32
  2. Problème de height dans mon conteneur
    Par darcy dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 19/12/2006, 09h37
  3. [C# 2.0] Problème de DLL dans mon site web
    Par Rodie dans le forum ASP.NET
    Réponses: 2
    Dernier message: 04/12/2006, 16h43
  4. Problème d'affichage dans mon état
    Par gontrand16 dans le forum Access
    Réponses: 6
    Dernier message: 05/07/2006, 20h29
  5. Problème de paramètres dans mon code javascript
    Par cocacollection dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 15/03/2006, 10h53

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