Question

Three.js dit qui ne peut pas être chargé à plus de 65 k sommets.Dans mon pur webgl application, il ne dit rien, mais il ne montre pas la totalité de l'objet, lorsque j'essaie de gros objets.

Je suis déterminer à split mes objets à mettre dans les petits tampons, mais cela me rendrait triste.Est-il une meilleure solution?Est 65k vraiment la limite du montant de sommets?

Était-ce utile?

La solution

Oui, WebGL du vertex index buffers sont limitées à 16 bits maintenant.C'est parce qu'ils cherchent à faire de la version 1.0 comme la croix-plate-forme que possible, donc il y a une tendance à faire des trucs cible le plus petit dénominateur commun -- dans ce cas, les plates-formes mobiles avec peu de matériel graphique.

Une fois 1.0 est sorti et le rush initial est plus, ils sont susceptibles de desserrer ces contraintes avec l'aide d'extensions-une application sera en mesure de se demander si une extension est prise en charge par la mise en œuvre, et à en faire usage si c'est le cas, tout comme dans de bureau ordinaire OpenGL.Il y a déjà quelques extensions disponibles, mais encore une fois ils ne se sont autorisés avec un très large soutien du matériel, donc rien qui pourrait vous aider à augmenter votre nombre de sommets.Cependant, une fois qu'ils desserrer la croix-plate-forme de l'exigence, ils sont susceptibles de soutenir quelque chose comme la GL_OES_element_index_uint extension qui permet 32-bit sommet des indices.

Vous pouvez lire certaines de ces questions sur le Public WebGL liste de diffusion.

Autres conseils

Généralement, les autres réponses sont correctes, mais j'ai pensé que j'ajouterais un peu de clarification:

Les seuls types de données acceptés par WebGL (et OpenGL ES 2.0) pour les indices sont des octets non signés et des shorts non signés. Étant donné qu'un court métrage non signé a une plage de 0-65535, cela signifie que si vous utilisez GL.DrawElements (que la plupart des frameworks), vous ne pouvez référencer que 65k sommets par appel de dessin. C'est presque certainement de là que vient la restriction des trois.js. Veuillez noter que vous pouvez avoir beaucoup plus de 65k Triangles Dans un appel, tant qu'ils ne partagent que 65k Verts.

Si vous utilisez une géométrie non indexée (Gl.Drawarrays), vous pouvez avoir beaucoup plus de sommets par appel, mais gardez à l'esprit qui doivent presque toujours en répéter certains. Je pense que dans la plupart des cas, la réduction de l'utilisation de la mémoire GPU justifiera la division des appels de dessin.

Pour le moment, ce que vous pouvez faire, c'est diviser votre grand objet dans plusieurs segments d'éléments de 65k chacun et réindexer chaque segment afin que tous les segments aient des index de 0 à 65k. Je l'ai testé et WebGL le permet.

Maintenant, vous devrez entraîner les sommets qui sont partagés entre les segments. Dans ce cas, l'alternative la plus simple est de dupliquer ce sommet, donc il n'y a pas sommets partagés plus. Mais il y a plus Mémoire amicale alternatives.

J'ai une petite démo de ce fonctionnement (modèle cérébral avec environ 350 000 sommets divisé en 5 segments) http://youtu.be/axzinhkmpzs#t=2m33s

J'espère que ça aide ;-)

Parce que je ne peux pas commenter Giles, je mets ce commentaire ici:

OES_ELEMENT_INDEX_UINT a été ajouté aux «extensions Webgl approuvées par la communauté» !! L'extension est déjà activée dans Chrome Canary.http://www.khronos.org/registry/webgl/extensions/oes_element_index_uint/

Vous pouvez dessiner des sommets en utilisant soit drawElements (qui traverse un tableau d'indices dans un tableau de sommets) ou drawArrays, qui traverse directement un tableau de sommets.

Il ne semble pas y avoir de limite sur le nombre de sommets dans un tampon d'attribut lorsque vous utilisez drawArrays. Utilisant drawArrays est peut-être moins souhaitable car pour un maillage typique, vous devez spécifier chaque sommet à chaque fois qu'il apparaît dans une primitive. D'un autre côté, selon votre scène, cela peut être un moyen facile de réduire le nombre d'appels WebGL.

Je le mentionne uniquement parce qu'après avoir lu cette question et sa réponse acceptée, j'ai supposé longtemps que le nombre de sommets dans un drawArrays était également limité à 65k. Par accident, j'ai découvert que ce n'était pas le cas, et j'ai fini par obtenir une grande accélération en agrégeant des objets avec des matériaux communs dans des réseaux de sommet unique (contournant ainsi les frais généraux de performance par rapport qui semblent actuellement la charge des implémentations d'angle).

Pour autant que je sache, cela est généralement limité par le logiciel matériel et / ou pilote (le matériel utilise des indices 16 bits ou autres). Peut-être que trois.js jouent simplement en toute sécurité et essaie de s'assurer que votre webgl-app fonctionne sur toutes les cartes. La meilleure façon est probablement de décomposer vos modèles en morceaux plus petits, cela s'assurera que votre application prend en charge la plupart sinon tous les GPU utilisés aujourd'hui.

  • En utilisant immédiateMode (glbegin ... glend), il n'y a aucune restriction dans la quantité de sommets que vous pouvez faire passer, mais cela va être lent avec autant de sommets.
  • Vous pouvez essayer d'utiliser glGetIntegerv () Avec GL_INDEX_BITS, GL_MAX_Elements_vertices et GL_MAX_ELlements_indices pour interroger la quantité de bits d'index, les sommets maximum et les indices maximaux que la carte / le pilote prend en charge.
  • Si je me souviens bien, les tableaux de sommets et VBOS (objet tampon Vertex) ont tous deux des limites similaires (sur la même carte / pilote), donc la commutation entre eux ne vous aidera probablement pas (pas à 100% à ce sujet)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top