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 :

render to vertex buffer


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Par défaut render to vertex buffer
    bonjour,


    J'essaye d utiliser le VBO pour afficher les coordonnée que j'ai calculer dans mon FBO. J'ai utiliser ce tutoriel :
    http://www.devmaster.net/forums/showthread.php?t=7457 (pour les personne qui sont interéssé, il est pas mal!)

    J'ai choisis la deuxieme solution qui est copier a le frame buffer au pixel buffer et de le copier au VBO pour effectué le rendu

    Je ne sait pas trop si c la solution la plus efficace mais en tout cas sa ne marche pas...

    est ce que je fait les choses dans le bon ordre??? voici mon 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
     
    void DrawGLScene()
    {
       if (!p1->check() || !p2->check() || !p3->check() || !p4->check()){
             // Calling glFinish() is only neccessary to get accurate timings,
             // and we need a high number of iterations to avoid timing noise.
                 glFinish();
                 start = clock();
     
             p1->resetForce();
             p2->resetForce();
             p3->resetForce();
             p4->resetForce();
     
             p1->computeForce();
             p2->computeForce();
             p3->computeForce();
             p4->computeForce();
     
             bindToText();
             initFBO();
     
             performComputation();
     
             transferFromTexture(data,0);
             transferFromTexture(data2,1);
             transferFromTexture(force,2);
     
             setParticle();
     
       copyFBOtoPBO();
     
       drawVBO();
     
             glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT0_EXT, target, 0, 0);
             glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT1_EXT, target, 0, 0);
     
             glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
             glFinish();
             end = clock();
             total += (end-start);
             printf("total time = %lf\n",total);
       }
     
    }
    les fonction VBO/PBO sont les meme que dans le tutoriel:


    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
    void copyFBOtoPBO(void){
       glReadBuffer(attachmentpoints[flag]);
       glBindBufferARB(GL_PIXEL_PACK_BUFFER_EXT, vbo_vertices_handle);
       glReadPixels(0, 0, texSize, texSize, GL_RGBA, GL_FLOAT, 0);
     
       glReadBuffer(GL_NONE);
       glBindBufferARB(GL_PIXEL_PACK_BUFFER_EXT, 0 );
    }
    void drawVBO(void){
       glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo_vertices_handle);
       glEnableClientState(GL_VERTEX_ARRAY);
       glVertexPointer  ( 4, GL_FLOAT,4*sizeof(float), (char *) 0);
     
       glDisable(GL_LIGHTING);
       glColor3f(1, 1, 1);
     
       glDrawArrays( GL_TRIANGLES, 0,texSize*texSize );
       glEnable(GL_LIGHTING);
       glDisableClientState(GL_VERTEX_ARRAY);
    }
    et j'initialise le VBO dans le main avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void initVBO(void){
       glGenBuffersARB(1, &vbo_vertices_handle);
       glBindBufferARB(GL_PIXEL_PACK_BUFFER_EXT, vbo_vertices_handle);
       glBufferDataARB(GL_PIXEL_PACK_BUFFER_EXT, texSize*texSize*4*sizeof(float),NULL, GL_STREAM_DRAW_ARB );
    }

    sans le VBO, quand je transfere les donnée a parti de la texture,j'obtien les bonne chose dans "data" mais quand j'utilise le VBO c'est pas bon.

    Je pense que je doit pas ecrire dans les bon buffer ou j'ai msi sa dans le mauvais ordre..
    si qqun a une idée merci bien!!!!!!

  2. #2
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Par défaut
    devant le grand nombre de reponse je vait essayer de poser des question plus simple lol..

    j'arrive a afficher 4 point avec un vertex array (ouaisss!!!!!!!!!!!!!!!!!!!!!) mais (zut il y a un mais) quand je lance plusieur fois de suite mon programme je vois que mes point ne sont pas afficher tout le temp au meme endroit....pourtant mes donnée ne change pas et je ne fait rien....bizarre bizarre


    Quand je commence a utiliser mon FBO..bon la deja plus d'affichage...et j'ai une erreur openGL sur la ligne :
    glReadPixels(0, 0, texSize,texSize, GL_RGBA, GL_FLOAT, BUFFER_OFFSET(0));
    il me met :invalid operation

    si je remplace par
    glReadPixels(0, 0, texSize,1, GL_RGBA, GL_FLOAT, BUFFER_OFFSET(0));
    donc 1 a la place de texSize qui est egal a 4 (puisque 4point!), je n'est plus d'erreur mais a mon avis c faux puisque je ne lit pas tous les pixel... dans tous les cas rien ne s'affiche


  3. #3
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 18
    Par défaut
    C'est l'utilisation de ton glReadPixels qui cloche au niveau des 3e et 4e paramètres, il faut que tu spécifie la largeur et la hauteur de ta fenetre opengl

    exemple pour une fenetre en 1024*768 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glReadPixels(0, 0, 1024, 768, GL_RGBA, GL_FLOAT, BUFFER_OFFSET(0));
    En fait tu lui donnes le nombre de pixels dans une ligne et le nombre de lignes de pixels.

  4. #4
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Par défaut
    merci pour ta reponse!

    mais en fait c bien 4 et 1 qu'il me faut puisque j'essaye de calculer les coordonnée de 4 point (4pixel en fait). je lit donc bien 4*4 chiffre puisque chaque pixel correspond a 4 "chiffre" (RGBA)

    en fait je me suis appercu que je ne doit pas afficher au bon endroit c pour cela que je ne voit rien.

    en utilisant ces quelque lignes pour faire mes calcul (je fait des calcul sur la carte graphique):
    // viewport for 1:1 pixel=texture mapping
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    gluOrtho2D(0.0, 4, 0.0, 1);
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();

    glLoadIdentity();
    int viewport[4];
    glGetIntegerv(GL_VIEWPORT, viewport);
    glViewport(0,0,4,1);

    apres avoir fait ceci...je ne voit plus rien..en fait il me faudrai un truc qui fait l'inverse de sa!!!! c possible?

Discussions similaires

  1. pb Affichage Vertex buffer
    Par mushishi dans le forum DirectX
    Réponses: 11
    Dernier message: 28/03/2006, 03h07
  2. [Debutant] Affichage du contenu d'un vertex buffer
    Par Edouard Kaiser dans le forum DirectX
    Réponses: 12
    Dernier message: 20/12/2005, 10h26
  3. Vertex buffer et géométrie complexe
    Par Omeyocan dans le forum DirectX
    Réponses: 13
    Dernier message: 14/12/2005, 11h28
  4. Probleme avec le vertex buffer
    Par nicoo dans le forum DirectX
    Réponses: 12
    Dernier message: 19/10/2004, 21h45
  5. question sur les vertex buffer et index buffer
    Par airseb dans le forum DirectX
    Réponses: 9
    Dernier message: 25/08/2003, 02h38

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