OpenGL ya tiene algunos conceptos de 'Objeto'.
Por ejemplo, cualquier cosa con una identificación puede pasar como un objeto (también hay cosas específicamente llamadas 'Objetos'). Búferes, texturas, objetos de búfer de vértices, objetos de matriz de vértices, objetos de búfer de marco, etc. Con un poco de trabajo puedes envolver clases alrededor de ellos. También le brinda una manera fácil de recurrir a las antiguas funciones de OpenGL en desuso si su contexto no admite las extensiones. Por ejemplo, un VertexBufferObject podría recurrir al uso de glBegin (), glVertex3f (), etc.
Hay algunas formas en que puede necesitar alejarse de los conceptos tradicionales de OpenGL, por ejemplo, probablemente desee almacenar metadatos sobre los búferes en los objetos de búfer. Por ejemplo, si el búfer almacena vértices. ¿Cuál es el formato de los vértices (es decir, posición, normales, códigos de texto, etc.)? Qué primitivas usa (GL_TRIANGLES, GL_TRIANGLESTRIP, etc.), información de tamaño (cuántos flotadores están almacenados, cuántos triángulos representan, etc.). Solo para facilitar su conexión a los comandos de arrays de arrays.
Te recomiendo que mires OGLplus . Son enlaces de C ++ para OpenGL.
También glxx , eso es solo para la carga de extensión.
Además de envolver la API de OpenGL, debería considerar hacer una compilación de un nivel ligeramente superior por encima.
Por ejemplo, una clase de administrador de materiales que es responsable de todos sus sombreadores, cargarlos y usarlos. También sería responsable de transferirles propiedades. De esa manera puede llamar a: materials.usePhong (); material.setTexture (alguna textura); material.setColor (). Esto permite una mayor flexibilidad, ya que puede usar cosas más nuevas, como objetos de almacenamiento intermedio uniformes compartidos para tener solo 1 gran almacenamiento intermedio que contenga todas las propiedades que usan sus sombreadores en 1 bloque, pero si no es compatible, recurra a la carga en cada programa de sombreador. Puede tener 1 sombreador monolítico grande e intercambiar entre diferentes modelos de sombreador usando rutinas uniformes si es compatible o puede recurrir a usar un montón de sombreadores pequeños diferentes.
También puede ver cómo gastar en las especificaciones GLSL para escribir su código de sombreador. Por ejemplo, #include sería increíblemente útil y muy fácil de implementar en el código de carga de su sombreador (también tiene una extensión ARB ). También puede generar su código sobre la marcha en función de qué extensiones son compatibles, por ejemplo, use un objeto uniforme compartido o recurra al uso de uniformes normales.
Finalmente, querrá una API de canalización de representación de nivel superior que haga cosas como gráficos de escenas, efectos especiales (desenfoque, brillo), cosas que requieren múltiples pases de representación como sombras, iluminación y demás. Y además, una API de juego que no tiene nada que ver con la API de gráficos, sino que solo trata con objetos en un mundo.