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 :

Optimisation d'affichage de textures


Sujet :

OpenGL

  1. #1
    Membre expérimenté Avatar de cayou66
    Inscrit en
    Décembre 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2008
    Messages : 286
    Par défaut Optimisation d'affichage de textures
    Bonjour à tous,
    je me retrouve confronté à un léger problème mais qui risque de devenir très dérangeant pour la suite...
    Voilà tout, je charge une texture de type carte vue du ciel dans une scène openGL (à l'aide d'un contrôleur activeX, en MFC) mais cette texture a un léger flou. En effet, j'utilise gluBuild2DMipmaps pour charger la texture et je charge le fichier bitmap (enregistré en 24bits) de 996*660 avec la SDL (IMG_Load).

    L'image au final est plus flou que l'originale, et ça pourrait devenir désagréable par la suite. J'ai vu qu'on pouvait venir modifier les paramètres de chargement avec glTexParameter, qui étaient sur GL_LINEAR. En passant sur GL_NEAREST, la texture devient "pixélisée" ce qui est encore moins bien...
    Il m'est impossible d'arriver à me servir de glTexImage2D qui ne m'affiche rien (même si je donne une texture de 512*512)...J'aurais pensé qu'avec cette fonction je pourrais enlever le MipMap car je pense que le problème vient de là.

    Je pourrai fournir du code et des screenshot si besoin (pas avant demain).

    Merci beaucoup par avance,
    Cordialement.

  2. #2
    Membre expérimenté Avatar de cayou66
    Inscrit en
    Décembre 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2008
    Messages : 286
    Par défaut
    Un petit Up pour si quelqu'un connait un début de solution

    Au passage,j'ai un autre soucis avec la caméra cette fois-ci.
    Je dessine en 2 dimensions j'ai donc décidé d'utiliser une caméra en ortho, et donc je translate ma scène vers le fond et je n'utilise pas de gluLookAt.

    L'openGL est dessiné à travers un contrôleur activeX (en MFC ...).
    A l'ouverture tout se déroule bien, mais lorsque je veux le redimensionner le centre reste là où il se trouvait, donc ma scène ne suit pas le redimensionnement...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    glViewport(0, 0, iScreenWidth,iScreenHeight);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-iScreenWidth/2,iScreenWidth/2,-iScreenHeight/2,iScreenHeight/2,1,1000);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    Avec iScreenWidth,iScreenHeight les entiers représentant les coordonnées de mon contrôleur.
    Si quelqu'un a une idée...
    Merci par avance,
    Cdlt.

  3. #3
    Membre émérite

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Par défaut
    Est-ce que ce code est appele a chaque fois que la fenetre est redimensionnee ?

  4. #4
    Membre expérimenté Avatar de cayou66
    Inscrit en
    Décembre 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2008
    Messages : 286
    Par défaut
    Oui, j'ai plutôt l'impression que le problème se situe ailleurs mais je vois pas pour quelle raison...

    Le plus bizarre c'est qu'après avoir redimensionner l'activeX qui ne va pas se mettre comme il faudrait je "sauvegarde" mon activeX avec sa nouvelle taille et à la ré-ouverture la scène est bien dimensionnée...
    Comme si il passe quelque part au démarrage mais plus après...

    J'ai d'autres activeX qui se redimensionnent parfaitement (en ortho et en perspective) en ayant un code similaire.

  5. #5
    Membre expérimenté Avatar de cayou66
    Inscrit en
    Décembre 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2008
    Messages : 286
    Par défaut
    J'ai essayé de déplacer le glOrtho dans ma routine de dessin, rien n'y fait...

    Edit: Ah ben si! Dans le draw ça fonctionne

    Il me reste le problème de texture floue

  6. #6
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    Bjr,

    Les indications ici peuvent peut-être t'aider ?
    http://jeux.developpez.com/faq/3d/?p..._sprites_flous

  7. #7
    Membre expérimenté Avatar de cayou66
    Inscrit en
    Décembre 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2008
    Messages : 286
    Par défaut
    Merci pour le lien,
    je vais tester de décaler la surface qui reçoit la texture, je pense bien que c'est un décale d'un demi pixel qui flou le tout.
    Je testerai avec une texture en puissance de 2 aussi, du genre 512*512?

  8. #8
    Membre expérimenté Avatar de cayou66
    Inscrit en
    Décembre 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2008
    Messages : 286
    Par défaut
    Bon,
    j'ai essayé de modifier la surface de dessin en rajoutant une marge de 0.5 comme indiqué, ça ne change rien.
    Après, utiliser des textures à la puissance de 2 c'est impossible dût à la contrainte du projet...
    C'est franchement flou et je vois pas quoi faire...

  9. #9
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    Quelle genre de contraintes fait que tu ne peux pas avoir des textures en puissance de 2 ???
    Si ta carte fait 996*660 tu la met dans une texture en 1024x1024 ou en plusieurs parties et tu ne te sers que de ce dont tu as besoin en limitant tes coordonnées de textures. En général les flous viennent où de la puissance de 2 non respecté ou sinon du décalage d'un demi-pixel (en abscisse ET en ordonnée) qui n'a pas été fais. Et désactive les filtres.

  10. #10
    Membre expérimenté Avatar de cayou66
    Inscrit en
    Décembre 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2008
    Messages : 286
    Par défaut
    La contrainte du projet en lui même.
    Je charge des cartes données par le client, impossible de s'assurer qu'elles sont en 2^n.
    "Désactive les filtres" ???
    Tu pense au mipmap?

  11. #11
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    Citation Envoyé par cayou66 Voir le message
    Je charge des cartes données par le client, impossible de s'assurer qu'elles sont en 2^n.
    Tu peux quand même peut-être modifier un fichier pour qu'il soit en puissance de 2 juste le temps de tester si ça vient bien de là?
    Après si c'est le cas tu peux créer une texture plus grande que l'image et modifier les coordonnées de textures comme le propose oxyde356

    Si ta carte fait 996*660 :
    - tu crées une texture vide de 1024*1024 avec glTexImage2D (sans préciser de données dans le dernier paramètre)
    - tu remplis la texture avec l'image en utilisant glTexSubImage2D (une partie de la texture sera inutilisée)
    - tu recalcules les coordonnées de texture : 996/1024 et 660/1024
    (avec peut-être le décalage de 0.5 comme dit dans la FAQ si nécessaire)

    D'après la doc de gluBuild2DMipmaps, si la texture donnée n'est pas en puissance de 2 elle est redimensionnée ("scale") pour atteindre une taille en puissance de 2, c'est peut-être là que ce crée le flou.

    En faisant tout à la main tu maîtrises mieux ce qui se passe, mais il faut faire des calculs pour trouver la taille en puissance de 2 nécessaire pour contenir la texture, et conserver les tailles du fichier original et de la texture pour ajuster les coordonnées de texture à l'affichage.

    Edit : une idée, peut-être qu'il est aussi possible de redimensionner le tableau de pixel pour obtenir un tableau en puissance de 2 avant de le passer à la fonction gluBuild2DMipmaps??

    J'espère ne pas trop dire de bêtise, je débute un peu en openGL.

    Bon courage.

  12. #12
    Membre expérimenté Avatar de cayou66
    Inscrit en
    Décembre 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2008
    Messages : 286
    Par défaut
    J'utilise la lib SDL pour récupérer le pointeur void sur les données, que je donne à gluBuild2DMipmaps.
    Je peux peut être me servir de fonctions d'SDL pour modifier l'image (SDLgfx?).
    L'idéal pour moi serait de remplir une image de 1024*1024 par exemple avec un alpha à 0, et de poser ma texture dessus centrée. Je garde de cette façon les bords transparents...
    Je regarde ça dès que je peux

    Un indice supplémentaire, selon l'image le flou n'est pas le même. J'entends par là des ratio de dimensions différents. De plus je me sert de glOrtho pour "zommer/dezoomer" sur ma carte. Si l'image est plus petite, elle est suffisamment nette pour être validée.

  13. #13
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 098
    Par défaut
    A tout hasard, mais vraiment a tout hasard ...

    Si ca vient d'un probleme de filtrage de la texture, si tu force (avec les pilote nvidia on sait le faire) le filtrage sur ANISOTROPIC 16x (par exemple) ca donne le meme resultat ? (je dis ca au hasard, pour detecter si c'est un pb de filtrage ou pas).

    Peut etre essayer de filter avec un shader (filtrage que tu fais toi même) plutot que de laisser faire opengl ?
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  14. #14
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    Je pense tout de même que le problème réside dans sa texture qui n'est pas en puissance de 2, surtout si le flou change en fonction du ratio. Les textures qui ne sont pas en puissance de 2 ne sont supportés qu'à partir d'OpenGL 3. Mais dans tous les cas tu peux transformer une texture contenu dans un fichier qui n'est pas en puissance de 2 en une texture en puissance de 2 en RAM. Et pour cela utilise les fonctions que t'as conseillé Arkham46. Si l'utilisateur n'as pas de contraintes sur la taille de la carte c'est à toi de mettre en oeuvre les outils qui vont adapter cette carte pour ton moteur.

  15. #15
    Membre expérimenté Avatar de cayou66
    Inscrit en
    Décembre 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2008
    Messages : 286
    Par défaut
    Citation Envoyé par wax78 Voir le message
    A tout hasard, mais vraiment a tout hasard ...

    Si ca vient d'un probleme de filtrage de la texture, si tu force (avec les pilote nvidia on sait le faire) le filtrage sur ANISOTROPIC 16x (par exemple) ca donne le meme resultat ? (je dis ca au hasard, pour detecter si c'est un pb de filtrage ou pas).

    Peut etre essayer de filter avec un shader (filtrage que tu fais toi même) plutot que de laisser faire opengl ?
    Je vais essayer de jouer sur les paramètres de la carte graphique, pour voir.

    Citation Envoyé par oxyde356
    Je pense tout de même que le problème réside dans sa texture qui n'est pas en puissance de 2, surtout si le flou change en fonction du ratio. Les textures qui ne sont pas en puissance de 2 ne sont supportés qu'à partir d'OpenGL 3. Mais dans tous les cas tu peux transformer une texture contenu dans un fichier qui n'est pas en puissance de 2 en une texture en puissance de 2 en RAM. Et pour cela utilise les fonctions que t'as conseillé Arkham46. Si l'utilisateur n'as pas de contraintes sur la taille de la carte c'est à toi de mettre en oeuvre les outils qui vont adapter cette carte pour ton moteur.
    Je pense que le problème vient de là, si je veux obtenir un résultat net, c'est soit une texture carré, soit un openGL récent...

    Merci à tous pour vos réponses, je sais à quoi m'en tenir

  16. #16
    Membre expérimenté Avatar de cayou66
    Inscrit en
    Décembre 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2008
    Messages : 286
    Par défaut
    Et bien je confirme l'histoire de la texture carré,
    je viens d'essayer entre une carte standard(1125*771 pour être exact) et une carte (la même) mais dont j'ai extrait un carré de 512*512. La différence est flagrante!
    Regardez le résultat:


    Je n'ai rien exagéré, l'image reste d'origine en 512*512, mais se floute à fond dans le cas contraire.

  17. #17
    Membre expérimenté Avatar de cayou66
    Inscrit en
    Décembre 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2008
    Messages : 286
    Par défaut
    Me revoici avec un autre petit souci,
    un exemple vaut mieux que de longues explications

    J'ai une texture "pleine" (alpha = 1) et par dessus j'ai une autre texture de la même taille mais celle dernière est totalement transparente, avec au centre un petit rond plein.
    J'aimerais tout simplement savoir si lorsque je clique sur le rond c'est bien le rond que je vais choisir (je fais du picking) et si je clique sur la partie transparente de ma texture devant, je sélectionnerai la texture derrière.

    J'utilise déjà glReadPixels pour récupérer l'alpha sous ma souris, mais ce dernier renvoie l'alpha de la texture derrière (c.à.d. =1) lorsque je clique sur la partie transparente de la texture par dessus (j'espère que j'arrive à expliquer correctement ).

    Il semblerait que lorsque l'alpha = 0 le readPixel va chercher en dessous.

    Par contre ceci n'est pas vrai pour connaitre (toujours avec readPixel) le zBuffer, qui lui même si c'est transparent renvoie le zBuffer de l'objet où se trouve la souris.

    Je pourrais peut être mettre un alpha à 1, en éspérant que cela ne se voye pas...

    Avez vous une idée d'une éventuelle solution?
    Merci

  18. #18
    Membre expérimenté Avatar de cayou66
    Inscrit en
    Décembre 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2008
    Messages : 286
    Par défaut
    Oups,
    il semblerait qu'il soustrait l'alpha en fonction des couches de textures.
    Exemple: dessus j'ai 1/255, et dessous j'ai 255/255 il me sort 254/255...

    Edit:
    Pour être clair, j'aimerais faire du picking sur des objets, mais pas quand je clique sur une partie transparente de mon objet.

  19. #19
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    ReadPixel te renvoie la valeur du pixel, une fois la rasterization faite il n'y a plus de quad et de texture il n'y a plus que de pixel, hors si un pixel représente une partie d'un objet avec une texture opaque alors le pixel est opaque (alpha = 1). ça additionne les composantes et ça les clamps à [0;1]. Donc c'est normal que tu obtiennes ce résultat. En général pour faire du picking on utilise une méthode non graphique, une méthode mathématique, tu connais la position du curseur, tu connais la position de ton objet avec le rond et ça taille alors tu peux calculer si le curseur touche cet objet, après pour savoir si le curseur est sur le rond tu dois passer les coordonnées du curseur en relatif par rapport à la position de ton quad et aller vérifie dans la texture où se situe réellement le curseur (sur une partie transparente ou opaque). Si c'est transparent alors tu ne retourne pas cette objet et tu continue ton picking, sinon tu le retourne.

  20. #20
    Membre expérimenté Avatar de cayou66
    Inscrit en
    Décembre 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2008
    Messages : 286
    Par défaut
    En effet, je "dessine" deux fois la scène, dont une pour le picking, en mode SELECT. Je récupère de cette façon les objets que je traverse avec mon pointeur de souris. Il est vrai que je peux déduire si je me trouve sur mon objet rond ou pas, surtout que je définie une zone carré de sélection autour de l'objet rond. J'avais dit rond mais ça peut être n'importe quelle autre forme et surtout pas rond, dont le rectangle convient bien pour sélectionner.

    Si je fais une telle chose c'est que j'ai remarqué que mon "rond" est carrément plus net si il se trouve au centre d'une texture en 512*512 avec le reste en transparent (voir plus haut).

    Je trouverai bien une solution

Discussions similaires

  1. Pas d'affichage de texture sur certains PC
    Par octopus984 dans le forum GLUT
    Réponses: 7
    Dernier message: 19/04/2005, 13h22
  2. Probleme d affichage de texture
    Par venomelektro dans le forum OpenGL
    Réponses: 1
    Dernier message: 27/09/2004, 15h07
  3. affichage de textures
    Par khayyam90 dans le forum OpenGL
    Réponses: 3
    Dernier message: 05/07/2004, 10h31
  4. Optimiser l'affichage d'un fichier XML de grosse taille...
    Par UnPeuPerdu dans le forum XML/XSL et SOAP
    Réponses: 11
    Dernier message: 03/06/2004, 16h01

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