2011-12-28 15 views
9

Por lo tanto, entiendo cómo usar un Objeto Buffer Vertex, y que ofrece un gran aumento en el rendimiento sobre el dibujo en modo inmediato. Dibujaré muchos quads 2D (sprites), y quiero saber si se supone que debo crear un VBO para cada uno, o crear un VBO para guardar todos los datos.¿Cuántos VBOs uso?

Respuesta

17

No debe utilizar un nuevo VBO para cada sprite/quad. Así que ponerlos a todos en una sola VBO sería la mejor solución en su caso.

Pero, en general, no creo que se pueda responder en una oración.

Creación de una nueva VBO para cada quad no le dará un aumento de rendimiento real. Si lo hace, se perderá mucho tiempo con glBindBuffer llamadas para cambiar los VBO. Sin embargo, si crea VBO que contienen demasiados datos, puede tener otros problemas.

pequeñas OISCIV:

  • suelen ser más fáciles de manejar en el código del programa. Puede usar un nuevo VBO para cada objeto que represente. De esta forma puede administrar sus objetos muy fácilmente en su mundo
  • Si las VBO son demasiado pequeñas (solo unos pocos triángulos) no obtendrá mucho beneficio. Una gran cantidad de tiempo se pierde con el cambio amortiguadores (y tal vez cambiar shaders/texturas) entre tampones

OISCIV grandes:

  • Puede hacer toneladas de objetos con una sola drawArrays() llamada para un mejor rendimiento.
  • En función de los datos de su posible que se crea gastos generales para la gestión de una gran cantidad de objetos en un solo VBO (si lo desea mover uno de estos objetos y rotar otro objeto?).
  • Si sus OISCIV son demasiado grandes su posible que no se pueden mover en VRAM

Los siguientes enlaces pueden ayudarle a:

Vertex Specification Best Practices

1

utilizar una (o un pequeño número de) VBO (s) para contener todo/la mayor parte de su geometría.

En general, la API llama a menos que se necesita para hacer que su escena, mejor.

1

También depende de lo D que usted quiere hacer con esos sprites?

¿Son dinámicos? ¿Desea cambiar solo el centro del quad o quizás modificar los cuatro puntos?

Esto es importante porque si sus datos son dinámicos a continuación, en la forma más simple, se tiene que transferir desde la CPU a la GPU cada cuadro. ¿Tal vez podría realizar todos los cálculos en la GPU, por ejemplo, utilizando sombreadores de geometría?

También para quads muy simples/sprites se puede utilizar GL_POINT_SPRITE. Con eso hay que enviar solo un vértice para quad completo. Pero el inconveniente es que es difícil rotarlo ...