Hoy me he dedicado a 2 cosas (3 si contamos el catarro): hacer una página web para melt y aprender los conceptos básicos de OpenGL. Tras tener una ventana de renderizado y despejar un poco haciendo el html de la web, hoy iba dispuesto a aprender cómo hacer el bucle de renderizado, almacenar la geometría de los objetos, las texturas, etc. Todo el mundo dice que OpenGL tiene una buena API para aprender, y tienen bastante razón.
Yo ya conocía algunos de los procedimientos tras haber utilizado las DirectX administradas, aunque la parte de carga de modelos la hacía con las clases de utilidad y los cambios de estado se gestionaban cambiando tal o cual objeto. Sin embargo me encuentro ahoar con la posibilidad de usar varios sistemas para dibujar las geometrías, e implican almacenar los vértices y demás de maneras concretas.
La primera es el modo inmediato. Es la que todos habréis visto en los tutoriales de NeHe y realmente es algo muy sencillo. Pero tener que llamar a una función por cada vértice, por cada coordenada de textura y demás no la hacen demasiado eficiente, así que queda descartada.
Luego tenemos las display lists, que son como si empaquetásemos instrucciones del modo inmediato. Son mucho más eficientes y técnicamente puedes meter cualquier cosa. Sin embargo no me quedan muy claras. ¿Debería crear una lista por cada geometría? ¿Solo por las geometrías que están dentro del frustum? ¿Vale también para “empaquetar” instrucciones relacionadas con los materiales (asignar texturas y valores ambiental, difuso, …) ?
También están los vertex arrays que son precisamente arrays de vértices que le pasamos al renderizador con una sola función, pero no está cacheado como las display lists. Sin embargo, permite modificar los vértices a posteriori, cosa que las display lists no.
Por último tenemos los Vertex Buffer Objects o VBO. Se supone que tenderán a ser el estándar para este menester, pero ahora parece que están todavía muy verdes. Pueden ser dinámicos o estáticos, con lo que deberían ser equivalentes a los métodos anteriores. Sin embargo, los VBO estáticos parecen estar por debajo de las display lists en todos los benchmarks, y los VBO dinámicos tienen problemas de rendimiento.
Mis dudas son que no sé qué estructura crear y como utilizarlas. No sé si tengo que crear dichas estructuras cada frame una vez hecho el culling. Además, son estructuras que maneja internamente OpenGL, así que nosotros no reservamos memoria para ellas pero ¿dónde se almacenan? porque si es en la tarjeta gráfica, no creo que sea buena idea almacenar todo ahí.
Ahora, he de decir que la API en sí está muy bien diseñada y resulta sencilla de entender. Aunque puede que cuando empiece a utilizar las diversas extensiones la cosa se desmadre un poco. Menos mal que la página web ha quedado sencilla a la par que elegante. En cuanto tenga algo de contenido os la mostraré, no hay prisa.