Y a-t-il une limite de vertices dans WebGL?
Trois.js dit qu'on ne peut pas charger plus de 65K vertices. Dans mon application pure webgl, ça ne dit rien, mais ça ne montre pas tout l'objet quand 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-ce que 65k est vraiment le nombre limite de Sommets?
6 réponses
Oui, Les tampons d'index vertex de WebGL sont limités à 16 bits en ce moment. C'est parce qu'ils visent à rendre la version 1.0 aussi multiplateformes que possible, donc il y a une tendance à faire en sorte que les choses ciblent le plus petit dénominateur commun -- dans des cas comme celui-ci, les plateformes mobiles avec un matériel graphique limité.
une fois que 1.0 est sorti et le rush initial est terminé, ils sont susceptibles de desserrer ces contraintes à l'aide d'extensions -- une application sera en mesure de demander si une extension donnée est pris en charge par l'implémentation, et utilisez-la si elle l'est -- tout comme dans OpenGL de bureau ordinaire. Il y a déjà quelques extensions disponibles, mais encore une fois elles n'ont permis que celles avec un support matériel très large, donc rien qui pourrait vous aider à augmenter votre nombre de vertex. Cependant, une fois qu'ils relâchent l'exigence multiplate-forme, ils sont susceptibles de supporter quelque chose comme L'extension GL_OES_element_index_uint qui permet des indices vertex 32 bits.
Vous pouvez lire certains la discussion de ces questions sur le Public WebGL liste de diffusion.
en général, les autres réponses sont correctes, mais je me suis dit 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 les octets non signés et les shorts non signés. Comme un short non signé a une portée de 0-65535, cela signifie que si vous utilisez gl.DrawElements (ce que font la plupart des frameworks) vous ne pouvez faire référence qu'à des sommets de 65k par appel de draw. C'est presque certainement là où les trois.js restriction vient de. Veuillez noter que vous pouvez ont beaucoup plus de 65k triangles en un seul tirage, à condition 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 que presque toujours avoir à répéter certains d'entre eux. 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 Tirage.
pour le moment, ce que vous pouvez faire est de diviser votre gros objet en plusieurs segments de 65K éléments chacun et de ré-indexer chaque segment de sorte que tous les segments ont des index de 0 à 65K. Je l'ai testé et WebGL l'autorise.
Maintenant, vous aurez à travailler ces sommets qui sont partagés entre les segments. Dans ce cas, l'alternative la plus simple est de dupliquer ce vertex pour qu'il n'y ait pas partagé sommets plus maintenant. Mais il y a plus de mémoire amical alternative.
j'ai une petite démo de ce travail (cerveau modèle avec environ 350K sommets divisés en 5 segments) http://youtu.be/AXZiNHkMpZs#t=2m33s
j'espère que ça aide ;-)
Parce que je ne peux pas commenter sur Giles j'ai mis ce commentaire ici:
Oes_element_index_uint a été ajouté à "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 l'un ou l'autre drawElements
(qui parcourt un tableau d'indices dans un tableau de sommets) ou drawArrays
, qui traverse directement un réseau de Sommets.
il ne semble pas y avoir de limite sur le nombre de sommets dans un attribut buffer lorsque vous utilisez drawArrays
. En utilisant drawArrays
est peut-être moins souhaitable parce que pour un maillage typique vous devez spécifier chaque vertex 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 mentionne ceci seulement parce qu'après avoir lu cette question et sa réponse acceptée j'ai supposé pendant 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 matrices de sommet uniques (donc en contournant les têtes de performances per-buffer qui semblent actuellement angle de fardeau application.)
autant que je sache, ceci est généralement limité par le matériel et/ou le logiciel du pilote (le matériel utilise des indices de 16 bits ou autres). Peut-Être Trois.js joue juste la sécurité et essaie de s'assurer que votre application webgl fonctionne sur toutes les cartes. Probablement la meilleure façon est de décomposer vos modèles en plus petits morceaux, ce qui fera en sorte 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 pas de restriction dans le nombre de vertices que vous pouvez poussez, mais ça va être lent avec autant de Sommets.
- Vous pouvez essayer d'utiliser glGetIntegerv () avec GL_INDEX_BITS, GL_MAX_ELEMENTS_VERTICES et GL_MAX_ELEMENTS_INDICES pour interroger le nombre de bits d'index, de vertices maximum et d'indices maximum que la carte/pilote supporte.
- si je me souviens bien, les tableaux de Vertex et les VBO (Vertex Buffer Object) ont tous les deux des limites similaires( sur la même carte / pilote), donc passer entre eux n'aidera probablement pas (pas Sûr à 100% sur cet)