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 :

Rendu Offscreen sans ReadPixels


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 61
    Par défaut Rendu Offscreen sans ReadPixels
    Bonjour,

    Désolé de poser encore un question sur OpenGL, mais j'ai un peu de mal. Je veux faire une application qui utilise le résultat du rendu de OpenGL. D'après ce que j'ai lu cette méthode s'appelle le offscreen rendering. Pour l'instant je fais ca avec un glReadPixels pour récupérer le résultat dans mon propre buffer que je pourrai lire dans mon application par la suite. Mais j'ai vu que cette méthode est plutôt lente et que je dois faire du temps réel ... J'ai vu que pour des méthodes plus rapides il existe les Frame Buffer Objects (j'ai testé ils sont supportés par ma carte graphique), mais les seuls exemples que j'ai vu les utilisent pour faire du render to texture, donc pareil, se pose le problème de lire les données de la texture. Est ce que vous n'auriez pas un exemple pour obtenir le résultat dans un buffer dans la ram, que je pourrai lire directement dans mon application, et qui serait plus rapide que readPixels ?

    Merci encore pour votre aide

  2. #2
    Membre éprouvé Avatar de razmott
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    Par défaut
    Je pense que ça répond à ta question :

    http://www.developpez.net/forums/sho...d.php?t=287479

    @+

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 61
    Par défaut
    Merci de ta réponse. J'ai déjà lu ce topic, c'est peut être moi, mais je n'ai vu nul part ou ils disent concrètement comment faire pour récupérer l'ensemble de l'image dans un buffer en mémoire.

  4. #4
    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
    ça a déjà été discuté plusieurs fois sur le forum
    il y a les PBO e les FBO
    après si tu veux récupérer les pixels pour les traiter avec le cpu ou pour une capture d'écran, tu devras passer par readpixels
    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.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 61
    Par défaut
    Ok donc la syntaxe est la même avec les framebuffers. Mais c'est plus rapide de faire un glReadPixels sur un FBO plutôt que directement sur le back buffer ? Et si oui est ce que tu sais pourquoi ?
    Merci

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 61
    Par défaut
    Désolé j'ai encore un problème, j'ai essayé de faire du readback avec les fbos mais j'y arrive pas. Voilà 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
     
    glGenFramebuffersEXT(1, &fbo);
     
    glGenTextures(1, &color);
    glBindTexture(GL_TEXTURE_2D, color);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, width, height, 0, GL_RGB, GL_FLOAT, 0);
     
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, color, 0);
     
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
     
    glBegin(GL_POLYGON);
    	glVertex3f (0.25, 0.25, 0.0);
    	glVertex3f (0.75, 0.25, 0.0);
    	glVertex3f (0.75, 0.75, 0.0);
    	glVertex3f (0.25, 0.75, 0.0);
    glEnd();
    glFlush();
     
    glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
     
    glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, image->imageData);
    et j'obtiens rien, alors que si je remplace glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); par glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
    et glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); par glReadBuffer(GL_BACK);
    pour faire la méthode directe ça marche.
    J'ai pas du comprendre grand chose au fonctionnement des fbos

  7. #7
    Yno
    Yno est déconnecté
    Membre éprouvé Avatar de Yno
    Inscrit en
    Novembre 2005
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 138
    Par défaut
    Citation Envoyé par shenron666
    après si tu veux récupérer les pixels pour les traiter avec le cpu ou pour une capture d'écran, tu devras passer par readpixels
    http://www.opengl.org/documentation/...tteximage.html

    Je ne suis pas très doué en anglais, mais il me semble que cette fonction renvoie les données d'une texture... ? Donc il ne devra pas forcément passer par ReadPixels.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 61
    Par défaut
    Désolé j'ai maintenant un problème bizarre avec les PBOs. J'ai essayé de faire la même chose que dans le lien que tu m'as passé shenron666, mais après 2h de tentatives, j'abandonne, je n'y arrive pas. C'est pourtant très bien expliqué.
    Voilà 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
     
    int width = 640;
    int height = 480;
    int imageSize = width*height*3;
     
    // J'initialise
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
    glutInitWindowSize(width, height);
    glutCreateWindow("OpenGL");
     
    // Je charge mes fonctions
    glGenBuffers = (PFNGLGENBUFFERSARBPROC)wglGetProcAddress("glGenBuffersARB");
    glBindBuffer = (PFNGLBINDBUFFERARBPROC)wglGetProcAddress("glBindBufferARB");
    glBufferData = (PFNGLBUFFERDATAPROC)wglGetProcAddress("glBufferDataARB");
    glMapBuffer = (PFNGLMAPBUFFERARBPROC)wglGetProcAddress("glMapBufferARB");
    glUnmapBuffer = (PFNGLUNMAPBUFFERARBPROC)wglGetProcAddress("glUnmapBufferARB");
     
    // Je crée mon pbo
    GLuint imageBuffer;
     
    glGenBuffers(1, &imageBuffer);
    glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, imageBuffer);
    glBufferData(GL_PIXEL_PACK_BUFFER_ARB, imageSize, NULL,	GL_STREAM_READ);
     
    // Je fais un rendu de la scène
    glClearColor(0, 0, 0, 0);
    glClear(GL_COLOR_BUFFER_BIT);
    glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
    glBegin(GL_POLYGON);
    	glVertex3f (0.25, 0.25, 0.0);
    	glVertex3f (0.75, 0.25, 0.0);
    	glVertex3f (0.75, 0.75, 0.0);
    	glVertex3f (0.25, 0.75, 0.0);
    glEnd();
    glFlush();
     
    // Et je lis le résultat
    glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, imageBuffer);
    glReadPixels(0, 0, width, height, GL_BGR, GL_UNSIGNED_BYTE,BUFFER_OFFSET(0));
    Et la, j'ai une erreur qui me dit que j'ai pas le droit d'écrire au pointeur nul. Pourtant vu que j'ai activé juste avant le pbo, ca devrait écrire dedans non ?

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

Discussions similaires

  1. Rendu offscreen & taille des textures
    Par zenux dans le forum OpenGL
    Réponses: 7
    Dernier message: 27/03/2011, 20h45
  2. Rendu offscreen tronqué
    Par LapinGarou dans le forum OpenGL
    Réponses: 4
    Dernier message: 23/01/2007, 19h27
  3. Réponses: 2
    Dernier message: 05/07/2006, 12h09
  4. Changement de point de vue + Rendu Offscreen
    Par jimjim dans le forum OpenGL
    Réponses: 4
    Dernier message: 24/04/2006, 14h02
  5. p-buffer rendu offscreen
    Par chonos dans le forum OpenGL
    Réponses: 11
    Dernier message: 14/03/2006, 22h07

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