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 :

Capture d'écran avec OpenGL


Sujet :

OpenGL

  1. #1
    Débutant  
    Inscrit en
    Novembre 2008
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 357
    Points : 87
    Points
    87
    Par défaut Capture d'écran avec OpenGL
    Bonjour,

    J'ai crée une scène 3D avec OpenGL, et j'ai untilisé un simple menu Glut pour la manipulation de la scène.

    Je veux savoir, comment capturer l'image avec OpenGL et la sauvegarder au format bmp?

    Merci

  2. #2
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 209
    Points : 95
    Points
    95
    Par défaut
    A voir, mais la fonction glreadpixel peut peut être t'aider?

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 041
    Points
    33 041
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    avec gl_readpixels tu peux récupérer les pixels de l'écran dans une structure ou assimilée (RGB, RGBA, ... y'a plusieurs paramètres possibles).
    Ensuite, à toi de connaître le format de fichier et l'encodage nécessaire pour l'enregistrer correctement.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 894
    Points : 219 533
    Points
    219 533
    Billets dans le blog
    124
    Par défaut
    Bonjour,

    En effet, la fonction glReadPixels() est la première et la solution la plus simple. Mais, j'ose croire qu'elle est légèrement lente.
    Toutefois, vous pouvez aussi utiliser les Pixel Buffer Object (PBO) pour effectuer votre rendu dans un buffer et le récupérer coté CPU (pour en faire ce que vous voulez).

  5. #5
    Débutant  
    Inscrit en
    Novembre 2008
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 357
    Points : 87
    Points
    87
    Par défaut
    Bonjour,

    Merci pour votre aide,

    J'ai met le code suivant pour capturer l'écran à l'aide de la fonction glReadPixels

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    glReadBuffer(GL_BACK);
    		data = malloc(GL_RGBA * 500 * 500);
    if( data ) {
        glReadPixels(0, 0, 500, 500, GL_RGBA, GL_UNSIGNED_BYTE, data);
    }
    Cette fonction a pour objectif de récupérer tous les pixels de l'image, mais comment les sauvegarder dans une format bmp ou autre format?

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 894
    Points : 219 533
    Points
    219 533
    Billets dans le blog
    124
    Par défaut
    Pour la sauvegarde, il suffit d'écrire un fichier sur le disque. Le BMP reste le format un des plus facile à prendre en main

  7. #7
    Débutant  
    Inscrit en
    Novembre 2008
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 357
    Points : 87
    Points
    87
    Par défaut
    J'ai travaillé avec les fichiers texte seulement, donc j'ai aucune aidé sur la création d'un fichier image, est ce que vous pouvez me donner plus de détail, s'il vous plaît?

  8. #8
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 894
    Points : 219 533
    Points
    219 533
    Billets dans le blog
    124
    Par défaut
    Il faut ouvrir le fichier en mode binaire, ensuite écrire l'entête du fichier (description du fichier image) et ensuite écrire les données de couleur (RGB(A))

    Il y a plein d'exemple. La wiki est pas mal complète -> http://en.wikipedia.org/wiki/BMP_file_format

  9. #9
    Débutant  
    Inscrit en
    Novembre 2008
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 357
    Points : 87
    Points
    87
    Par défaut
    J'ai met ce 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
     
    glReadBuffer(GL_BACK);
    data = malloc(GL_RGBA * w * h);
    if( data ) {
        glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, dat);
    }
    sprintf(file,"image.bmp",cpt);
          if ((img = fopen(file,"w")) != NULL) {
             for (j=h-1;j>=0;j--) {
          for (i=0;i<w;i++) {
             fputc(data[3*j*h+3*i+0],fptr);
             fputc(data[3*j*h+3*i+1],fptr);
             fputc(data[3*j*h+3*i+2],fptr);
          }
       }
          }
    fclose(fptr);
     
    	counter++;
    data est un pointeur de type GLvoid, et fputc prend un entier comme paramètre

    Comment corriger l'erreur?

  10. #10
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 894
    Points : 219 533
    Points
    219 533
    Billets dans le blog
    124
    Par défaut
    Quelle erreur ? une erreur de compilation ?
    De toute façon, là, vous n'écrivez pas l'entête du fichier, j'ai l'impression.

  11. #11
    Débutant  
    Inscrit en
    Novembre 2008
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 357
    Points : 87
    Points
    87
    Par défaut
    Oui, une erreur de compilation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2664: 'fputc' : cannot convert parameter 1 from 'GLvoid' to 'int'

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 041
    Points
    33 041
    Billets dans le blog
    4
    Par défaut
    fwrite sera surement mieux à utiliser
    un fichier doit respecter un format, BMP est simple mais il faut tout de même le respecter
    pour le format du fichier, voir le lien wiki plus haut

  13. #13
    Débutant  
    Inscrit en
    Novembre 2008
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 357
    Points : 87
    Points
    87
    Par défaut
    Citation Envoyé par Bousk Voir le message
    fwrite sera surement mieux à utiliser
    un fichier doit respecter un format, BMP est simple mais il faut tout de même le respecter
    pour le format du fichier, voir le lien wiki plus haut
    Elle reste la même erreur, aucune fonction d'écriture dans un fichier prend comme paramètre un type GLvoid.

    comment écrire les pixels dans ce cas?

  14. #14
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 894
    Points : 219 533
    Points
    219 533
    Billets dans le blog
    124
    Par défaut
    Moi, je vois pas d'où il sort le fptr. Je croyais que le fichier était "img" ... enfin bref ... ce n'est pas une histoire d'écriture d'image ou d'OpenGL qui vous bloc, mais juste que vous avez écrit du code un peu aléatoirement, j'ai l'impression. Dans le code donnée, il y a dat, qui traine ... alors que c'est data

  15. #15
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 225
    Points : 10 168
    Points
    10 168
    Par défaut
    Elle reste la même erreur, aucune fonction d'écriture dans un fichier prend comme paramètre un type GLvoid.

    comment écrire les pixels dans ce cas?
    Tu débute en programmation ?

    Tu peux déclarer une adresse avec void si tu connais pas le type , ce qui est le cas de glReadPixels (le type tu le désigne avec GL_UNSIGNED_BYTE en argument).
    (Bref sinon revoir les pointeurs).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, dat);
    Pourquoi tu as mis GLvoid *dat ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    data = malloc(GL_RGBA * w * h);
    Par contre pas sur que GL_RGBA = 4.

    C'est pas super compliqué on gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    char *data;
    data = malloc(4 * w * h);
     
    glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, data);
     
    //code fopen , ecriture de entete.
     
    for(i = 0;i < w*h*4;i++)
    {
          fputc(data[i],file);
    }
     
    free(data);
    Par contre pour écriture elle n'est pas tous a fait exacte , en bitmap en doit écrire en BGR il me semble.

  16. #16
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 041
    Points
    33 041
    Billets dans le blog
    4
    Par défaut
    Quitte à écrire les données dans l'ordre, pourquoi diable faire une boucle pour faire un fputc alors qu'on a fwrite qui fait ça très bien ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    unsigned char* pDatas = malloc(3*width*height);
    glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, pixels);
    // fopen
    // header, cf : wikipedia sur le format bmp (bis repetita)
    fwrite((void*)pDatas, 1, 3*width*height, file);
    free(pDatas);
    GL_RGBA est un define qui est loin de valoir 4, il vaut 0x1908

    edit: amha le mieux est qd mm d'avoir une struct Pixel { unsigned char r,g,b; }; afin de réordonner aisément RGB en BGR ou quoi que ce soit ce dont on a besoin

  17. #17
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Salut,

    si tu n'as pas peur des dépendances tu as aussi SOIL : http://www.lonesock.net/soil.html (crossplatform)

    regardes la fonction "SOIL_save_screenshot"

    Au plaisir

Discussions similaires

  1. Problème de capture d'écran avec les media players
    Par mouhab dans le forum Windows XP
    Réponses: 7
    Dernier message: 01/01/2011, 20h50
  2. Réponses: 1
    Dernier message: 18/03/2009, 00h34
  3. [Stratégie] Capture d'écran avec sélection
    Par Dimitri_87 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 07/07/2008, 10h12
  4. Capture d'écran avec SDL à une résolution choisie
    Par shenron666 dans le forum OpenGL
    Réponses: 3
    Dernier message: 02/05/2006, 09h27

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