Con los VBO generalmente tiene dos ventajas principales.
La ventaja 1 se relaciona con datos totalmente estáticos y proviene de poder mantener sus datos de vértice en la memoria que es más óptima para la GPU.
La ventaja 2 se relaciona con los datos dinámicos y proviene de poder especificar sus datos de vértice en cualquier momento antes de usarlos para la representación, lo que puede canalizar mejor.
Una tercera ventaja proviene del procesamiento por lotes de llamadas de extracción, pero también se comparte con las matrices de vértices de la vieja escuela, por lo que no lo llamo específicamente para VBO. El envío de datos a una GPU (o el uso de datos que ya están en la GPU) es similar en muchos aspectos al disco de E / S y el tráfico de red; si tiene algunos lotes grandes, es más eficiente que muchos lotes pequeños.
Una buena analogía (no 100% precisa pero suficiente para ayudarte a entender la idea) es si eres un conductor de autobús que tiene que llevar a 50 personas de una ciudad a otra. Puede cargarlos uno a la vez y hacer 50 viajes separados, eso es glBegin / glEnd. Alternativamente, puede poner los 50 en el autobús y simplemente hacer un solo viaje, que es agrupar con conjuntos de vértices o VBO (en el caso de VBO, las 50 personas ya estarían en el autobús;)).
Sin embargo, esto tiene un precio, y aquí el precio es que pierde la capacidad de especificar datos de vértice cuando lo necesite. Bueno, está bien, puede hacerlo (con algo de trabajo adicional), pero no obtendrá el rendimiento completo de su código. En cambio, debe pensar más en sus datos de vértices, cómo se usan, cómo (y si) deben actualizarse, si se pueden realizar animaciones en un sombreador (permitiendo así que los datos permanezcan estáticos; los VBO realmente necesitan sombreadores para un muchos casos de animación para que funcionen bien) o si necesita respetar los datos de vértice de cada cuadro, estrategias de actualización eficientes si es el último, etc. Si no hace esto y solo implementa una conversión ingenua, tiene un riesgo muy alto de poner ¡en un montón de trabajo solo para que el resultado final sea más lento!
Esto puede parecer mucho trabajo cuando lo encuentras por primera vez, pero en realidad no lo es. Una vez que entres en el modo de pensar así, en realidad encontrarás que es increíblemente fácil y casi es algo natural. Pero puede arruinar sus primeros intentos y no debería desanimarse si es así: arruinarlo es una oportunidad para aprender de lo que hizo mal.
Algunas reflexiones finales.
Tener los datos de su modelo en un formato que pueda cargarse fácilmente en un VBO puede ayudarlo a facilitar todo este proceso. Eso significa que debe evitar formatos más complejos o exóticos, al menos al principio (y hasta que se sienta más cómodo con el proceso); mantenga las cosas tan simples y básicas como sea posible cuando aprenda y habrá menos cosas que saldrán mal, y menos lugares donde buscar errores si (¡o cuándo!) las cosas salen mal.
Las personas a veces se desaniman si ven una implementación de VBO que usa más memoria que una implementación optimizada / comprimida de glBegin / glEnd (incluso pueden referirse a ella como "desperdicio"). No seas así. Excepto en casos extremos, el uso de memoria es realmente no que importante. Aquí es una compensación clara: está aceptando un uso de memoria potencialmente mayor a cambio de un rendimiento sustancialmente mayor. También ayuda a desarrollar la mentalidad de que la memoria es un recurso barato y abundante que está ahí para ser utilizado; El rendimiento no lo es.
Y, finalmente, el viejo castaño: si ya es lo suficientemente rápido, entonces su trabajo está hecho. Si está alcanzando su velocidad de fotogramas objetivo, si tiene espacio libre para condiciones transitorias, entonces es lo suficientemente bueno y puede pasar al siguiente paso. Puede perder mucho tiempo y energía exprimiendo un 10% extra de algo que realmente no lo necesita (estado allí, hecho, aún caer en la trampa), así que siempre considere cuál es el uso más óptimo de su propio tiempo ¡Porque el tiempo del programador es aún menos barato y menos abundante que el rendimiento!