Android glGLStravelEurope o glDrawElements?

¿Cuál es la mejor manera? ¿Si utilizo drawarrays, o si utilizo drawelements? ¿Diferentes?

Para ambos, se pasan a OpenGL algunos búferes que contienen datos de vértice.

GlDrawArrays es básicamente "dibujar esta gama contigua de vértices, usando los datos que te di anteriormente". Bueno:

  • No es necesario crear un búfer de índice

Malo:

  • Si organiza sus datos en GL_TRIANGLES, tendrá datos de vértice duplicados para triángulos adyacentes. Esto es obviamente inútil.
  • Si utiliza GL_TRIANGLE_STRIP y GL_TRIANGLE_FAN para evitar duplicar datos: no es muy efectivo y tendría que hacer una llamada de representación para cada tira y ventilador. Las llamadas OpenGL son costosas y deben evitarse cuando sea posible

Con glDrawElements, se pasa un buffer que contiene los índices de los vértices que se desea dibujar.

Bueno

  • Sin datos de vértice duplicados: sólo indexa los mismos datos para triángulos diferentes
  • Sólo puede utilizar GL_TRIANGLES y confiar en el caché de vértices para evitar el procesamiento de los mismos datos dos veces – no es necesario volver a organizar sus datos de geometría o dividir la representación en varias llamadas

Malo

  • Sobrecarga de memoria del búfer de índice

Mi recomendación es usar glDrawElements

Las implicaciones de rendimiento son probablemente similares en el iPhone, la Guía de Programación de OpenGL ES para iOS recomienda el uso de tiras de triángulo y unir tiras múltiples a través de triángulos degenerados.

El enlace tiene una bonita ilustración del concepto. De esta manera usted podría reutilizar algunos vértices y todavía hacer todo el dibujo en un solo paso.

Para obtener el mejor rendimiento, sus modelos deben presentarse como una tira de triángulo sin un solo uso utilizando glDrawArrays con el menor número posible de vértices duplicados. Si sus modelos requieren varios vértices para ser duplicados (debido a que muchos vértices son compartidos por triángulos que no aparecen secuencialmente en la tira de triángulo o porque su aplicación combinó muchas tiras de triángulo más pequeñas), puede obtener un mejor rendimiento utilizando un búfer de índice independiente y llamando a glDrawElements en lugar. Hay un trade off: una tira de triángulo no indexada debe duplicar periódicamente vértices completos, mientras que una lista de triángulos indexados requiere memoria adicional para los índices y añade una sobrecarga para buscar vértices. Para obtener los mejores resultados, pruebe sus modelos usando tiras de triángulo indexadas y no indexadas, y use el que realice el más rápido.

Siempre que sea posible, ordene los datos de vértice e índice para que los triángulos que comparten vértices comunes se dibujen razonablemente cerca uno del otro en la tira de triángulo. El hardware gráfico a menudo almacena en caché los cálculos de vértices recientes, por lo que la localidad de referencia puede permitir que el hardware evite calcular un vértice varias veces.

La desventaja es que usted necesita probablemente un paso del preprocessing que clasifique su acoplamiento para conseguir tiras bastante largas. No pude llegar a un algoritmo agradable para esto todavía, así que no puedo dar ningún rendimiento o números de espacio en comparación con GL_TRIANGLES. Por supuesto, esto también depende en gran medida de las mallas que desea dibujar.

De hecho, puede degenerar la tira de triángulo para crear tiras continuas para que no tenga que dividirlo mientras usa glDrawArray.

He estado usando glDrawElements y GL_TRIANGLES pero pensando en usar glDrawArray en lugar de GL_TRIANGLE_STRIP. De esta manera no hay necesidad de crear vector inidices.

¿Alguien que sabe más sobre la cosa del escondite del vértice que se mencionó arriba en uno de los postes? Pensando en el rendimiento entre glDrawElements / GL_TRIANGLE vs glDrawArray / GL_TRIANGLE_STRIP.

La respuesta aceptada es un poco anticuada. Siguiendo el enlace doc en la respuesta de Jorn Horstmann, OpenGL ES Guía de Programación para iOS , Apple describe cómo usar el truco de "triángulos degenerados" con DrawElements , obteniendo así lo mejor de ambos mundos.

Los menores ahorros de algunos índices mediante DrawArrays no vale la pena los ahorros que obtiene al combinar todos sus datos en una sola llamada GL, DrawElements. (Podrías combinar todo usando DrawArrays, pero luego cualquier "wasted elements" sería perder vértices, que son mucho más grandes que los índices, y requieren más tiempo de render también.)

Esto también significa que no es necesario considerar cuidadosamente todos sus modelos, en cuanto a si la mayoría de ellos se pueden representar como un número mínimo de tiras, o son demasiado complejos. Una solución uniforme, que maneja todo. (Pero trate de organizar en tiras cuando sea posible, para minimizar los datos enviados y maximizar la probabilidad de GPU de volver a usar los cálculos de vértice recientemente caché.)

BEST: Una sola llamada de DrawElements con GL_TRIANGLE_STRIP, que contiene todos sus datos (que está cambiando en cada marco).

  • Herramientas de OpenGL ES para Android
  • Cuando se utiliza GLES20.glReadPixels en android, los datos devueltos por él no son exactamente iguales con la vista previa en vivo
  • Cómo detectar el clic en un objeto en OpenGL ES en la aplicación de Android?
  • Convertir matriz de int en Bitmap en Android
  • Android OpenGL ES GL10 o GL11
  • Visualización de texto (como puntuación) que cambia en cada fotograma
  • Android ejecuta OpenGL ES 1.1 o 1.0?
  • Nunca obtuvo 480 * 800 total cuando se utiliza la proyección ortogonal 2D en opengl-es
  • Framerate tartamudea ocasionalmente en Android opengl es 2.0
  • Compartir el contexto EGL2.0 entre 2 GLSurfaceViews causó EGL_BAD_ACCESS en las tabletas Android
  • Dibujo de mapas de bits más rápido en el lienzo de Android o OpenGL
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.