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

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    novembre 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2006
    Messages : 80
    Points : 50
    Points
    50

    Par défaut glMultiDrawArrays : comment récupérer l'indice dans le vertex shader ?

    Bonjour tout le monde.

    Je dois ajouter une question à celle-ci, mais elle ne rentrait pas dans le titre.
    Est-il possible d'appeler "glMultiDrawArrays" avec des intervalles se chevauchant ?
    Ou pour être plus explicite : si j'ai, dans mon buffer, une maison, un vélo et un banc, puis-je dessiner 5 maison, trois vélos et deux bancs avec un seul appel à glMultiDrawArrays ?

    Pour que cela soit possible il faut que:
    1/ glMultiDrawArrays accepte que je lui donne cinq fois l'intervalle contenant la maison, trois fois celui du vélo etc.
    2/ il faut que, côté vertex shader, je puisse distinguer les cinq instances des maisons etc.

    Idéalement, il y aurait, côté vertex shader, une variable magique comme gl_InstanceID qui contiendrait un truc allant de 0 à 9 (5 maisons + 3 vélos + 2 bancs = 10 objets).
    Je pourrais de là utiliser un tableau (en fait une texture à une dimension) contenant les transformations pour les dix objets.
    Côté vertex shader, je pourrais récupérer la matrice à utiliser grâce à la variable magique précédemment nommée.

    Pour le 1/, j'entends bien qu'on pourrait me répondre "ben essaie et tu verras bien". Heu, oui, mais avant de me lancer dans un truc qui de toute façon peut échouer de mille façons, autant demander si quelqu'un a déjà essayé ou sait si ça ne marchera pas. Mon niveau en opengl n'est pas très bon (mais c'est pas faute d'essayer).

    Pour le 2/ il semblerait que gl_instanceid soit réservée au cas où ... il y a de l'instanciation, ce qui n'est pas mon cas.
    Il y a ce lien (en anglais) https://www.gamedev.net/forums/topic...-in-opengl-3x/ qui semble parler de quelque chose de rapprochant de mon problème. Je n'ai pas spécialement le temps de le voir ce soir, hélas.

    Je ne demande pas de code, bien entendu. Je cherche plutôt à savoir si:
    1/ il existe un gros "STOP" au fait d'utiliser le même intervalle plusieurs fois dans un glMultiDrawArrays
    2/ si un tel STOP n'existe pas, comment produire deux résultats différents à partir du même intervalle.

    Des pistes, des noms de fonctions. Un début de quelque chose.

    (je ne peux pas répondre en journée, ni même lire les réponses. Je n'ai accès à internet que le soir (vers 1h30 du mat) et pas pendant très longtemps. Cependant, je dispose d'une clef usb pour télécharger des trucs à voir pendant la journée. Donc des pages web, des pdf, des vidéos ...)

    J'ai également cherché un topic contenant les règles pour poster ici, mais sans succès. Je ne sais pas, par exemple, si j'ai le droit de mettre le lien en anglais que j'ai mit. Si ce n'est pas le cas, je plaide pour ma défense que ce n'est pas par flemme de chercher que je n'ai pas respecté les règles, ni par volonté de les enfreindre.

    Je vous remercie par avance et vous souhaite une agréable journée.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    novembre 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2006
    Messages : 80
    Points : 50
    Points
    50

    Par défaut

    Je doute fortement que cela intéresse qui que ce soit mais :
    1/ oui, il est possible d'appeler glMultiDrawArrays en lui donnant plusieurs fois le même intervalle.
    2/ il est possible de récupérer l'indice, mais c'est une feature 4.6. Dans le vertex shader, cela prend la forme d'une variable s'appelant gl_DrawID (respectez la casse), qu'il n'y a pas besoin de déclarer. Cette variable contient 0 pour le premier intervalle, 1 pour le second etc.

    J'ai testé cela sur un petit code (donc pas encore à plus grande échelle, il faudra attendre pour avoir la confirmation que tout marche bien tout le temps).
    La carte graphique que je possède est une 1030 (et donc semble avoir opengl 4.6 dessus).

    Bien entendu, pour que le shader soit en 4.6 il faut qu'il commence par "#version 460" (de tête, je n'ai pas le code sous les yeux).
    Cela signifie quand même qu'a priori ça ne fonctionne pas sur les appareils mobiles (je ne sais pas, je n'en ai pas sous la main).

    Il semblerait qu'il y ait une extension ARB qui permette d'avoir cette fonctionnalité avant la 4.6 (en fait 4.6 aurait intégré en core feature un truc existant en extension, mais je ne suis pas du tout un pro sur le sujet). Mais je ne sais pas ce qu'il en est pour les trucs mobile, s'ils sont concernés par les trucs arb etc.

    Donc je continue à chercher.

  3. #3
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    juin 2005
    Messages
    1 928
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2005
    Messages : 1 928
    Points : 10 127
    Points
    10 127
    Billets dans le blog
    4

    Par défaut

    Effectivement, c'est disponible depuis OpenGL 4.6, ou avec l'extension ARB_shader_draw_parameters (basée sur OpenGL 4.3).
    Donc pour les mobiles, pour lesquels on n'a qu'OpenGL ES (2.0, 3.0, 3.1 ou 3.2) ca peut etre tendu (mais comme OpenGL ES 3.1 est basé sur OpenGL 4.x, il est possible que l'extension soit présente sur certains mobiles).
    Pour le dev mobile, il vaut mieux de toute facon écrire un renderer spécifique (et pourquoi pas un renderer Vulkan )
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

Discussions similaires

  1. Réponses: 12
    Dernier message: 26/04/2010, 13h50
  2. Comment récupérer l'indice dans un TdxTreeList ?
    Par claude dans le forum Composants VCL
    Réponses: 5
    Dernier message: 20/12/2004, 15h17

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