2010-12-02 7 views
3

cela doit être simple, mais il me manque. J'ai un modèle complexe qui a plus de 32767 sommets. maintenant, les index ne peuvent être passés à opengl que comme type GL_UNSIGNED_BYTE ou GL_UNSIGNED_SHORT. java n'a pas de concept de unsigned, de sorte que l'option short non signé correspond simplement à (signed) short, qui est 16 bits, ou +32767. quand je spécifie les vertices, je dois passer opengl un short [], où les valeurs dans le tableau pointent vers un vertex dans le tableau vertice. cependant, s'il y a> 32767 sommets, la valeur ne rentrera pas dans le short [].java opengl: glDrawElements() avec> 32767 sommets

Y a-t-il une autre façon de spécifier les indices? extrait de code est ci-dessous, merci.

short[] shorts = ... read the indices ...; 
    ... 
    ShortBuffer indicesBuffer = null; 
    ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * Short.SIZE/8); 
    ibb.order(ByteOrder.nativeOrder()); 
    indicesBuffer = ibb.asShortBuffer(); 
    indicesBuffer.put(indices); 
    indicesBuffer.position(0); 
    ... 
    gl.glDrawElements(GL10.GL_TRIANGLES, numOfIndices, GL10.GL_UNSIGNED_SHORT, indicesBuffer); 
    ... 
+0

par la façon dont cela se trouve être sur la plate-forme Android en utilisant opengl-es 1.0. –

+0

Je pense que la plupart du téléphone ne peut pas gérer cette complexité avec des performances raisonnables. –

Répondre

4

Je ne l'ai pas utilisé OpenGL de Java, donc je suis spéculant ici, mais il y a une bonne chance que vous pouvez simplement utiliser les nombres négatifs dont reprentation binaire est le même que les nombres positifs non signés que vous voulez vraiment. Vous donnez à GL quelques paires d'octets et lui dites de les interpréter comme non signés, et tant qu'ils ont la bonne valeur lorsqu'ils sont interprétés de cette façon, cela devrait fonctionner. Ce n'est pas grave si Java pensait qu'ils voulaient dire quelque chose de différent quand il stockait ces bits en mémoire.

Si vous itérez, ignorez simplement le bouclage et continuez à incrémenter. Quand vous arrivez à -1, vous avez terminé.

Si vous calculez les numéros d'index comme ints (qui n'ont pas ce problème de plage) puis coulée à court, soustraire 65536 de tout chiffre qui est supérieur à 32767.

+0

oui, je suis arrivé à la même conclusion. vous êtes bizarre pour une langue qui est haute et puissante sur la sécurité de type. J'ai d'abord utilisé char, car c'est essentiellement un short non signé. Je calcule les indices comme ints puis convertir juste pour le rendre plus simple et assurer –

+0

merci, j'ai fini par les traiter comme ints eux coulée à court avec le cveat que vous avez fourni ci-dessus, bien que je me demande si l'opération de moulage prendrait soin de automatiquement. Vous vous demandez ce que les gens qui ont créé les liaisons java étaient des pensées ... Java étant tous haut et puissant sur la sécurité de type et tous. –

+2

Ne parlez pas d'OpenGL, parlez d'OpenGL ES :). ES ne prend pas en charge GL_UNSIGNED_INT pour les index, seulement GL_UNSIGNED_BYTE et GL_UNSIGNED_SHORT, et cela n'a rien à voir avec Java. –

Questions connexes