Me gustaría dibujar un gran número (múltiples miles) de mallas simples (cada una quizás ... un máximo de 50 triángulos, pero incluso ese es un límite superior muy grande), todos los cuales son exactamente iguales.
Como una simple forma de fuerza bruta, en este momento solo estoy haciendo miles de llamadas de extracción, donde solo cambio las matrices de transformación que necesitan los sombreadores y luego vuelvo a dibujar los mismos objetos.
Por supuesto, esto es terriblemente lento, ya que (supongo) hay demasiadas llamadas de extracción para que el controlador y mi PC se manejen de manera eficiente.
¿Qué puedo hacer para hacerlo más rápido?
Respuestas:
La solución a esto es la instancia. Este tutorial explica algunos métodos de creación de instancias. Si tienes
ARB_draw_instanced
yARB_instanced_arrays
, úsalos.La idea general es almacenar todas las transformaciones de sus mallas en un objeto de búfer separado y vincularlo a una matriz de atributos que utiliza un "vértice" por instancia a través de
glVertexAttribDivisor
.Si, después de eso, todavía no está corriendo tan rápido como lo desea, probablemente esté vinculado al procesador de vértices. Haga el sacrificio de frustum en las mallas, y preferiblemente construya un BVH para atravesar en lugar de hacer el sacrificio en todas las mallas de forma independiente.
fuente
glVertexAttribDivisor
(que no está desaprobado ni desactualizado de ninguna manera) tiene el beneficio de no tener un límite superior en el recuento de instancias. El rendimiento ha sido históricamente mejor que los amortiguadores uniformes, pero ahora es probablemente el mismo o muy similar, y en ambos sentidos se hace el trabajo.