Recién estoy comenzando con OpenGL, y estoy intentando usarlo para crear un juego 2D. En este juego, tengo una cuadrícula hexagonal compuesta de una gran variedad de hexágonos de diferentes colores. Como programador novato de OpenGL, veo dos formas de dibujar esta cuadrícula:
- Usando un búfer de vértices con los datos para un solo hexágono, luego usando un valor de compensación uniforme e iterando en la CPU para dibujar el mismo programa muchas veces hasta que tenga una cuadrícula.
- Crear un búfer de vértice precalculado muy grande y singular que dibuja todos los hexágonos en una sola llamada.
¿Cuál es el método más eficiente? ¿Hay una mejor manera de hacer esto?
Respuestas:
De hecho, hay algunas maneras de hacer una cuadrícula de este tipo.
La forma más eficiente sería la instancia. De esta manera, crea su hexágono solo una vez en un VBO y lo renderiza cien, mil o un millón de veces. Puede hacerlo manualmente usando sombreadores con uniformes como dijo en el punto 1, pero también tiene una funcionalidad OpenGL incorporada. Para eso, eche un vistazo a glDrawElementsInstanced .
Tenga en cuenta que la creación de instancias solo es más rápida que otros métodos si dibuja más de una cierta cantidad de objetos instanciados. Por ejemplo, dibujar 300 puede ser más rápido usando 1 VBO grande, pero dibujar 2 millones puede ser más rápido si usa renderizado instanciado.
Si utiliza la representación instanciada, puede enviar datos por objeto utilizando divisores de atributos . En su caso, desearía enviar la posición y el color.
Un buen tutorial sobre renderizado instanciado: haga clic
Realmente, la mejor manera es probar ambos métodos y verificar la cantidad de milisegundos que se necesitan para dibujar 1 fotograma. De esta manera también aprendes en ambos sentidos, lo que siempre es bueno.
También tenga en cuenta que el renderizado instanciado es una funcionalidad moderna de OpenGL, y que tendrá que usar sombreadores para usarlo. Pero siempre es mejor aprenderlo de la manera correcta desde el principio.
fuente
El método 1 es más simple de codificar y estará bien siempre que no tenga demasiados hexágonos a la vista a la vez. Es posible que desee seguir con esto ya que es nuevo en OpenGL, para evitar poner demasiada complejidad en su plato a la vez.
Si hay una gran cantidad de hexágonos (como varios cientos o más de mil) a la vista, sería necesario un método de sobrecarga más baja para evitar la sobrecarga de la CPU de hacer tantos sorteos individuales. El método 2 funcionaría para esto, o incluso mejor, usar instancias. Esperaría que la instancia sea más rápida que el método 2, o ciertamente no peor, ya que solo tiene que actualizar un búfer de datos por instancia en lugar de un búfer (mucho más grande) de datos de vértice para todas las instancias.
fuente