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 :

GL_UNSIGNED_SHORT et glDrawElements


Sujet :

OpenGL

  1. #1
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 785
    Points
    1 785
    Par défaut GL_UNSIGNED_SHORT et glDrawElements
    Bonjour,

    Je travaille sur le portage de mon moteur 3D sur androïd, et après avoir perdu 1 semaine avant de me rendre compte que glDrawElements n'acceptait pas GL_UNSIGNED_INT sur OpenGL ES 2.0 (mais l'accepte sur ES 3.0, et à priori c'est même plus compliqué que ça car cela pourrait dépendre de la version d'androïd) je suis à la recherche d'un moyen élégant de contourner cette limitation de 65536 vertices / buffer. L'objectif étant d'avoir un moteur qui fonctionne sur toutes les versions d'OpenGL modernes (3.x+ et ES 2.x+) avec le même niveau de fonctionnalités.
    J'aimerais savoir si certains parmi vous se sont déjà confronté au problème et si oui quelles solutions avez vous choisit ?

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    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 214
    Points : 10 140
    Points
    10 140
    Par défaut
    C'est intéressant a savoir ,j'avais prog sur android mais j'ignorais cette limitation avec GL_UNSIGNED_INT , je dirais que pour contourner ce probleme t'utiliser glDrawArrays.

  3. #3
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 785
    Points
    1 785
    Par défaut
    Oui c'est une solution, mais c'est un peu dommage de perdre l'avantage en performance de glDrawElements (un bon article de développez sur le sujet d'ailleurs, avec une comparaison des perfs ). Et puis ça va me demander pas mal de refactor pour ça, et j'ai la grosse flemme. Disons que le ferait sans soucis si ça allait dans le bon sens, mais je suis septique

  4. #4
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 785
    Points
    1 785
    Par défaut
    J'ai trouvé ce qui pourrait être une solution ici :

    vertex buffer: [v1,v2,v3,v4,v5,v6,..v131071]
    index buffer 1: [0,1,2,...65535]
    index buffer 2: [0,1,2,...65535]

    Render all vertices:
    glVertexPointer(3, GL_FLOAT, sizeof(myVertexStruct),0);
    glDrawElements(index buffer 1);

    glVertexPointer(3, GL_FLOAT, sizeof(myVertexStruct),sizeof(myVertexStruct) * 65536);
    glDrawElements(index buffer 2);
    Je vais essayer de l'implémenter.

    EDIT : Je suis bête, ça ne peut pas fonctionner, on peut avoir des faces avec le premier indice à 0 et le suivant à 70000...

  5. #5
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    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 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Citation Envoyé par Jbx 2.0b Voir le message
    Oui c'est une solution, mais c'est un peu dommage de perdre l'avantage en performance de glDrawElements.
    Et puis ça va me demander pas mal de refactor pour ça, et j'ai la grosse flemme. Disons que le ferait sans soucis si ça allait dans le bon sens, mais je suis septique
    Je suis d'accord que niveau perf , on peut voir la différence surtout sur +65000 face.

    Citation Envoyé par Jbx 2.0b Voir le message
    J'ai trouvé ce qui pourrait être une solution

    Je vais essayer de l'implémenter.

    EDIT : Je suis bête, ça ne peut pas fonctionner, on peut avoir des faces avec le premier indice à 0 et le suivant à 70000...
    Non mais je pense que c'est une bonne idée
    Mais c'est vrai que on peut pas avoir accès sur le deuxième objet ,les vertices du premier , mais je pense que pour contourner le probleme le mieux c'est de créer plusieurs objet (en se limitant a 65000 face) , soit avec un éditeur , soit en prog (et comme tu as surement la flemme de le faire , et même moi j'aurais la flemme de le faire ) , donc je pense que tu peux considérer que sur android il y a une limite de a peu pres 65000 faces.

  6. #6
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 785
    Points
    1 785
    Par défaut
    Ouais je crois que ça va finir comme ça ! A la limite j'vais mettre juste un flag pour passer de int (version desktop et OpenGL ES 3.0) vers short (ES 2.0 et inférieur). Avec 65.000 faces / objet y a déjà de quoi s'amuser sur un mobile

Discussions similaires

  1. glDrawElement et multitexturing
    Par Kaktus dans le forum OpenGL
    Réponses: 1
    Dernier message: 25/10/2008, 22h10
  2. Réponses: 2
    Dernier message: 06/10/2008, 10h04

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