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 :

Selection de primitive performante


Sujet :

OpenGL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 14
    Points : 19
    Points
    19
    Par défaut Selection de primitive performante
    Bonjour,

    Je développe une application opengl qui nécessite le codage d'un fonction de selection de primitive à la souris rapide. Les maillages affichés sont de l'ordre de la centaine de milliers de triangles.

    J'ai déja expérimenté le picking (glRenderMode(GL_SELECT)) sans succés : fonctionne mais trop lentement pour de gros objets.

    J'ai ensuite expérimenté le système par index de couleur qui fonctionne déja bcp plus rapidement mais pas encore suffisament.

    Ma question : Pour accélerer la selection en mode index couleur, je désirerai stoquer l'image en mode index couleur pour pouvoir effectuer des tests de couleur (glReadPixel par ex) sans devoir re-renderiser à chaque click de souris (oui j'ai besoin de quelque chose de TRES rapide). Je m'explique mieux : apres un rendu en mode index couleur de mon maillage, je désirerai stoquer l'image obtenue dans un buffer et effectuer mes tests de selection sur ce buffer (et non sur le tampon écran). Quelle est la méthode la plus efficace pour faire cela, est-ce qu'un "glReadPixel de toute la surface écran" est la seule solution ? (je n'aime pas car il y a un transfert mem video -> mem vive qui est plutot lent)

    Deuxième question : J'ai entendu parler de "layers" par ami. Selon lui il s'agirai d'un bibliothèque externe qui permettrai de faire du rendu par couche. (Tres utile pour re-afficher seulement les primitives qui viennent d'etres selectionnées par un glissement + click de souris par exemple). Quelqu'un connaitrait-il cette lib ?

    Merci par avance.

    Rémi.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 14
    Points : 19
    Points
    19
    Par défaut
    Bonjour c'est re-moi.

    Je vois que personne n'a répondu

    Si vous avez la moindre idée / suggestion n'hésitez pas !

  3. #3
    Membre averti Avatar de Bob.Killer
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    336
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 336
    Points : 332
    Points
    332
    Par défaut
    Oyo

    je sais pas si j'ai tout compris, mais t'as essayé le picking ?
    Pensez aux tutoriels programmation : http://programmation.developpez.com/cours-tutoriels/

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 14
    Points : 19
    Points
    19
    Par défaut
    Oui j'ai essayé le picking (avant d'implementer le mode index couleur), et les résultats n'étaient pas satisfaisants : trop lent lorque les maillages deviennent gros > 5000 triangles.

  5. #5
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 80
    Points : 85
    Points
    85
    Par défaut
    pourquoi est-ce que tu dis que tu dois faire un glReadPixel de toute la surface écran? Tu ne pourrais pas seulement rendre en mode indexé dans un offscreen buffer(pbuffer, frame buffer object, ou copyteximage dans une texture) et ensuite aller chercher seulement le pixel qui t'intéresse? Ça te ferait un transfert beaucoup moins grand.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 14
    Points : 19
    Points
    19
    Par défaut
    C'est ce que je fais.

    Actuellement voici ce que je fais à chaque "evaluation" de selection:
    1/ je renderise en mode index couleur toute l'image
    2/ je fais un read pixel sur une petite zone (4x4 ) autour du pointeur de la souris.

    phase 1 : un peu trop lente
    phase 2 : tres rapide

    j'aimerai en fait stoquer une bonne fois pour toutes l'image en index couleur et ensuite faire toutes les "evaluations" de selection sur cette image. Il me faut donc copier l'image du backbuffer en une zone memoire (ram video ou ram CM ?) et ensuite utiliser cette zone memoire pour les tests

    ma question : quelle est la méthode la plus efficasse pour faire cette copie ?

    autre question existe t'il d'autres solutions pour selectionner les primitives que celles précédement citées ?

    pour info : mon soft : http://www.unfold3d.com

  7. #7
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 80
    Points : 85
    Points
    85
    Par défaut
    est-ce que ton image change régulièrement ou c'est toujours la même chose?

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 14
    Points : 19
    Points
    19
    Par défaut
    Une fois que l'utilisateur a oritenté/zoomé/panné sa vue, l'image ne change plus bien entendu. C'est là que viennent les multiples étapes de selection par simple click our par glissement de souris (avec la même image en index couleur).

    Lors du glissement de souris (bouton droit de souris enfoncé) un test de sélection est effectué à chaques positions du pointeur. C'est là que tout doit être TRES rapide (ceci pour le confort de l'utilisateur).

  9. #9
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 80
    Points : 85
    Points
    85
    Par défaut
    Pour faire une copie mémoire vidéo -> mémoire système je crois que readpixel doit être un standard. Tu peux aussi faire un GetTexImage si le contenu qui t'intéresse est dans une texture.

    Pour que le contenu de ton buffer en color index soit stocké en mémoire vidéo et qu'il ne soit pas écraser par le prochaine rendu dans le back buffer, tu peux faire un CopyTexImage qui va te permet de copier le contenu du backbuffer courant vers une texture. C'est sûrement cette option qui va te demander le moins de modification dans ton code.

    Tu peux aussi utiliser le Pbuffer ou le frame buffer object pour rendre le buffer en mode indexé. Il te sera ensuite possible d'aller lire ce buffer ou la texture qui lui est associée pour obtenir l'information qui t'intéresse. De cette façon tu sauveras une copie en mémoire vidéo.

    Je ne connais pas tellement le rendu en mode indexé. Si c'est beaucoup plus lent qu'un rendu dans un mode normal, peut-être que tu peux implémenter ton propre mode indexé au lieu de prendre celui qui est build in dans le driver.

    Si ton rendu avait changé à chaque itération et que le nombre de sélection avec la souris avait été important. Tu aurais peut-être pu utiliser le multiple render target pour dessiner la scène à la fois dans un mode normal et dans un mode indexé dans 2 buffers différents. À la fin du rendu, tu aurais pu effectuer un read pixel en fonction de la position de la souris.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 14
    Points : 19
    Points
    19
    Par défaut
    Merci pour ces informations, c'est ce que j'attendais. Je vais faire quelques recherches, et j'implementerai ensuite.

    Je te tiens au courant.


    Merci encore.

Discussions similaires

  1. Multi-selection dans une ComboBox ?
    Par Moloko dans le forum MFC
    Réponses: 5
    Dernier message: 07/07/2021, 17h26
  2. [VB6] [Crystal] Selection enregistrement
    Par littlecow dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 11/01/2005, 13h08
  3. Primitive du noyau
    Par freud dans le forum Programmation d'OS
    Réponses: 5
    Dernier message: 25/11/2002, 03h17
  4. TEdit : selection du texte et autre fonction
    Par Odulo dans le forum Composants VCL
    Réponses: 5
    Dernier message: 01/08/2002, 14h27
  5. faire un selection dans une image aves les APIs
    Par merahyazid dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/04/2002, 10h44

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