tutorial texture started getting web-applications webgl

web-applications - started - webgl texture



¿Hay un límite de vértices en WebGL? (6)

En general, las otras respuestas son correctas, pero pensé que agregaría un poco de aclaración:

Los únicos tipos de datos aceptados por WebGL (y OpenGL ES 2.0) para índices son bytes sin firmar y cortos sin firmar. Como un corto sin signo tiene un rango de 0-65535, esto significa que si está utilizando gl.DrawElements (lo que hacen la mayoría de los marcos), solo puede hacer referencia a 65k vértices por llamada al dibujo. Esto es casi seguro de donde proviene la restricción three.js. Tenga en cuenta que puede tener mucho más de 65k triángulos en una llamada de sorteo, siempre y cuando solo compartan 65k de verts.

Si usa una geometría no indexada (gl.DrawArrays), puede tener muchos más vértices por llamada, pero tenga en cuenta que casi siempre tiene que repetir algunos de ellos. Creo que en la mayoría de los casos, la reducción en el uso de la memoria de la GPU justificará dividir las llamadas al sorteo.

Three.js dice que no se pueden cargar más de 65k vértices. En mi aplicación webgl pura, no dice nada, pero no muestra todo el objeto cuando pruebo objetos grandes.

Estoy pensando en dividir mis objetos para ponerlos en pequeños buffers, pero me pondría triste. ¿Hay alguna solución mejor? ¿65k es realmente la cantidad límite de vértices?


Hasta donde yo sé, esto generalmente está limitado por el hardware y / o el software del controlador (el hardware usa índices de 16 bits o similares). Tal vez Three.js solo juegue a lo seguro e intente asegurarse de que su aplicación webgl funcione en todas las tarjetas. Probablemente, la mejor manera es dividir sus modelos en pedazos más pequeños, esto asegurará que su aplicación admita la mayoría de las GPU, si no todas, que se usan actualmente.

  • Usando el modo inmediato (glBegin ... glEnd), no hay restricción en la cantidad de vértices que puedes empujar, pero va a ser lento con tantos vértices.
  • Puede intentar usar glGetIntegerv () con GL_INDEX_BITS, GL_MAX_ELEMENTS_VERTICES y GL_MAX_ELEMENTS_INDICES para consultar la cantidad de bits de índice, vértices máximos e índices máximos que admite la tarjeta / el controlador.
  • Si mal no recuerdo, las Matrices Vertex y las VBO (Objeto Buffer Vertex) tienen límites similares (en la misma tarjeta / controlador), por lo que cambiar entre ellas probablemente no ayude (no estoy 100% seguro de esto)

Por el momento, lo que puedes hacer es dividir tu gran objeto en varios segmentos de 65K elementos cada uno y volver a indexar cada segmento para que todos los segmentos tengan índices de 0 a 65 K. Lo he probado y WebGL lo permite.

Ahora, tendrá que entrenar esos vértices que se comparten entre los segmentos. En ese caso, la alternativa más simple es duplicar ese vértice para que ya no haya vértices compartidos . Pero hay más alternativas amigables con la memoria .

Tengo una pequeña demostración de este funcionamiento (modelo de cerebro con aproximadamente 350K vértices divididos en 5 segmentos) http://youtu.be/AXZiNHkMpZs#t=2m33s

Espero que ayude ;-)


Sí, los búferes de índice de vértices de WebGL están limitados a 16 bits en este momento. Esto se debe a que pretenden hacer que la versión 1.0 sea lo más multiplataforma posible, por lo que hay una tendencia a hacer que las cosas se centren en el denominador común más bajo: en casos como este, las plataformas móviles con hardware de gráficos limitado.

Una vez que 1.0 está fuera y la prisa inicial ha terminado, es probable que disminuyan estas limitaciones con la ayuda de extensiones: una aplicación podrá preguntar si una extensión dada es compatible con la implementación, y hacer uso de ella si es - al igual que en el escritorio regular OpenGL. Ya hay algunas extensiones disponibles, pero de nuevo solo permitieron aquellas con soporte de hardware muy amplio, por lo que no hay nada que lo ayude a aumentar su conteo de vértices. Sin embargo, una vez que aflojan el requisito multiplataforma, es probable que admitan algo así como la extensión GL_OES_element_index_uint que permite índices de vértices de 32 bits.

Puede leer un debate sobre estos temas en la lista de correo Public WebGL .



Puede dibujar vértices utilizando drawElements (que atraviesa una matriz de índices en una matriz de vértices) o drawArrays , que atraviesa una matriz de vértices directamente.

No parece haber ningún límite en la cantidad de vértices en un búfer de atributo cuando usa drawArrays . Usar drawArrays es posiblemente menos deseable porque para una malla típica, debe especificar cada vértice cada vez que aparece en una primitiva. Por otro lado, dependiendo de su escena, esta puede ser una manera fácil de reducir el número de llamadas WebGL.

Menciono esto solo porque después de leer esta pregunta y su respuesta aceptada, asumí durante mucho tiempo que el número de vértices en un drawArrays también estaba limitado a 65K. Por accidente, descubrí que no era así, y terminé obteniendo una gran aceleración agregando objetos con materiales comunes en matrices de vértices únicos (lo que me permitió evadir los gastos generales de rendimiento por buffer que actualmente pesan en las implementaciones de ANGLE).