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 :

Stocker fond d'écran


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 115
    Par défaut Stocker fond d'écran
    Bonjour.
    J'ai un fond d'écran complexe (obtenu par addition de 235235 sprites)
    Je souhaite le sauvegarder quelque part et faire le traitement suivant

    Loop
    {
    Récupérer le fond d'écran
    Afficher mes sprites ou mes poygones animés par dessus
    Effacer
    }

    J'ai essayé de faire ça avec glReadBuffer() avant la boucle suivi de glDrawPixels() au moment du rappel du fond d'écran mais c'est d'une lenteur innommable.
    Peut-être faut-il que je transforme le tableau obtenu par le glReadBuffer() en texture ? Avez vous une idée ? (bien évidemment ma texture n'est pas de taille 2 puissance A, 2 puissance B)
    Merci

  2. #2
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 582
    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 582
    Par défaut
    Et sans afficher ton fond, sans le glReadPixels donc, c'est lent ou pas ?
    235235 sprites c'est pas peu, pourquoi autant ?
    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.

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 115
    Par défaut
    C'est parfaitement fluide sans l'affichage du fond
    235235 sprites c'est une image, disons qu'il y a bien une vingtaine de sprites plus ou moins grands
    Le truc c'est que je veux éviter de tout redessiner ce fameux fond d'écran vu qu'il est fixe

  4. #4
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    A mon avis le plus simple est de le transformer en texture. Tu dis que ton image n'est pas une puissance de 2 alors soit tu la transformes pour que ce le soit, soit tu rempli le reste par du blanc/noir et tu n'afficheras que la partie remplie.

    Jc

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 115
    Par défaut
    C'est bien avec GLTexImage que ça se passe ?

  6. #6
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 582
    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 582
    Par défaut
    Tu ne pourrais pas décomposer ton fond lui même en quelques sprites ?
    tu le recomposerai en quelques Quads et ce serai bien plus rapide
    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.

  7. #7
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 115
    Par défaut
    Mmh non je ne veux pas décomposer le background
    J'ai essayé le code suivant
    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
     
     
    unsigned int tex;
    GLubyte *pixels = new GLubyte[1024*1024*4];
    glReadBuffer(GL_FRONT);
    glGenTextures(1,&tex);
    glReadPixel(0,0,SCREEN_W,SCREEN_H,GL_RGBA,GL_UNSIGNED_BYTE,pixels);
     
    glBindTexture (GL_TEXTURE_2D, tex);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,1024,1024,0,GL_RGBA,GL_UNSIGNED_BYTE,pixels);
     
    while(condition)
    {			
    glBindTexture(GL_TEXTURE_2D, tex);
     
    glBegin(GL_QUADS);
    glTexCoord2i(0,0);
    glVertex2i(0,0);
     
    glTexCoord2i(1,0);
    glVertex2i(SCREEN_W,0); // 800
     
    glTexCoord2i(1,1);
    glVertex2i(SCREEN_W,SCREEN_H); // 800*600
     
    glTexCoord2i(0,1);
    glVertex2i(0,SCREEN_H); // 600
    glEnd();
     
    ... // affichage des éléments animés
     
    allegro_gl_flip();
    glClear(GL_COLOR_BUFFER_BIT);
    }
     
    delete [] pixels;
    Ca ne veut pas marcher, le fond n'est pas redessiné. Seuls les éléments animés apparaissent.
    La problématique est "comment convertir en texture ce qu'il y a à l'écran à un moment donné ?"
    Qu'est ce qui ne va pas ?
    Merciiiiiiiii

  8. #8
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    ha oui, forcement, avec des glReadBuffer et glDrawPixels, c'est lent...
    tres lent même...
    donc la solution est bien de passer le fond d'ecran fixe en texture au chargment... comme ca se sera probablement stocké en memoire video et super plus rapide à afficher...
    et le probleme des puissance de 2 peut etre resolu en utilisant gluBuild2Dmipmap...
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  9. #9
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 115
    Par défaut
    C'est précisément ce que je veux faire !!! Quelles sont les commandes qui permettent de faire cette opération ?
    Merci !

  10. #10
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    c'est a peut pres le code que tu a utilisé, sauf qu'au lieu d'utiliser glTexImage2D, tu utilise gluBuild2DMipmap qui va automatiquement te transformer ta texture en texture en puissance de 2 et en prime te generer tout les mipmap pour ta texture...

    pour la doc de gluBuild2DMipmap c'est ici
    http://rush3d.com/reference/opengl-redbook-1.1/chapter09.html
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  11. #11
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 115
    Par défaut
    Merci Bafman, tout fonctionne bien :-)
    En revanche ma texture est dégradée par l'appel à gluBuild2DMipmap
    A l'origine j'ai un magnifique png 800*600 faisant office de fond d'écran.
    là il est vraiment moche... (gros pâtés de pixels)
    Le passage en puissance de deux puis le repassage en taille normale a dû me casser tout ça. Comment rendre tout cela propre ?

  12. #12
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    heu... ton fond d'ecran, tu ne doit surtout pas le charger à chaque frame... tu le passe en texture au demarrage de l'appli et puis c'est bon tu peut l'afficher autant de fois que tu veut par la suite...
    en gros ca dennera un truc du genre
    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
     
    init(){
        // plein de code pour initialiser openGL
        glClear(CL_COLOR_BUFFER_BIT);
        dessinFond();
        glReadPixels(...);
        glTenTexture(...);
        glBindTexture(...);
        gluBuild2DMipmap(...); // creation de la texture recuperer depuis le 
    fond
    }
     
    rendu(){
        // passage en mode ortho2D
        glBindTexture(laTextureDeFond);
        glBegin(GL_QUADS);
            // dessin d'un quad recouvrant tout l'ecran
        glEnd();
        // dessin du reste de la scene
    }
    }
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  13. #13
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 115
    Par défaut
    oui oui c'est bien ce que je fais !!!
    Le chargement se fait avant la boucle de rendu !
    Par contre je le répète ma texture est dégradée par rapport à l'original...

  14. #14
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 582
    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 582
    Par défaut
    Si tu ne veux pas passer par glReadPixels/glDrawPixels pour cause de rapidité, tu dois passer par une texture

    Mais comme tu l'as remarqué, tu perds en qualité parceque ton image est transformée en puissance de 2 vu que ta carte ne supporte pas les textures "non power of two"

    La seule solution pour conserver la qualité de ton image, c'est de la découper en blocs de puissance de 2 :

    Ton image fait 800*600
    800 = 512 + 256 + 32 = 3 dimensions
    600 = 512 + 64 + 16 + 8 = 4 dimensions
    total = 3 * 4 = 12 sous images

    fais toi une classe/routine/fonction qui fait ces calculs et qui s'occupe d'afficher ton image à partir des sous images qu'elle va générer
    c'est courant en 3D de découper une grande image en sous parties

    vas voir sur cette page :
    http://www.opengl.org/resources/code/samples/advanced/advanced97/programs/programs.html
    et cherches la source "An example of using a very large texture by 'paging' in pieces."
    si tu veux le source en question :
    texpage.c
    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.

  15. #15
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Bonjour.
    Je pense qu'un glViewport peut se reveler ttrès utile pour ton problème.
    J'explique :
    Tu initialises tes matrices MV et P, et tu specifie un viewport de taille descente, vu que ce ne sera fait qu'un seule fois, disons donc 1024x1024.
    Tu dessines tes 2xx.xxx sprites, tu récupère le contenu du BACKBUFFER dans une texture via glTexImage2D, comme ça t'aura une texture X de bonne qualité (n'oublie pas le buidMipmap).

    Ensuite, tu initialises à nouveau ta matrice de projection et un nouveau viewport de la taille de la fenêtre je dirais.
    Maintenant, à chaque itération, tu dessines un Quad texturé avec la texture X et tu fais le reste du boulot. Ca devrait éliminer cette dégradation, car je pense qu'elle provient du fait que la texture est trop petite. J'espère que c'est ça en tout cas.

  16. #16
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 582
    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 582
    Par défaut
    en fait je pense que son image, passée dans gluBuild2dmipmaps, est rescalée en 512*512, d'où la perte de qualité
    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.

  17. #17
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 115
    Par défaut
    Désolé pour le retard dans mes réponses, je n'avais pas accès à internet ce week end.
    Shenron => l'idée du découpage est... excellente, je vais la tester
    Ca fait déjà deux fois que tu me sauves la mise, merci beaucoup

  18. #18
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 582
    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 582
    Par défaut
    de rien, pas question de se sauver la mise, juste de s'entre aider
    tu nous dira si le résultat obtenu est à la hauteur
    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.

  19. #19
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 115
    Par défaut
    Le résultat est parfait
    J'ai utilisé le GetTexImage2D car le gluBuildMipmap continue à me dégrader la texture.
    J'éditerai ce message plus tard dans la journée afin d'y poster le code final pour que cela puisse servir à d'autres
    A tout à l'heure donc

  20. #20
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    pas normal que gluBuild2DMipmap degrade ta texture... normalement, il te la scale a la puissance de 2 superieur à la taille courante, donc normalement pas de perte de qualité...
    par contre tu affiche peut etre un mauvais mipmap (pas le premier)... essaye en enlevant le filtrage pour voir
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. emplacement de l'image de fond d'écran win xp
    Par t26 dans le forum Windows XP
    Réponses: 3
    Dernier message: 02/09/2005, 10h22
  2. image de fond d'écran
    Par badr dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 28/04/2005, 16h50
  3. [Debutant] Fond d'écran
    Par Tchakeur dans le forum OpenGL
    Réponses: 2
    Dernier message: 24/01/2005, 11h47
  4. Problème de clignotement de fond d'écran en mode MDI
    Par Tardiff Jean-François dans le forum Composants VCL
    Réponses: 3
    Dernier message: 17/12/2004, 16h19
  5. Comment changer l'image Bitmap en fond d'écran du bureau ?
    Par Maddelphi dans le forum API, COM et SDKs
    Réponses: 8
    Dernier message: 23/06/2004, 19h57

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