O OpenGL já possui alguns conceitos de 'Objeto'.
Por exemplo, qualquer coisa com um ID pode passar como um objeto (também existem itens especificamente chamados 'Objetos'). Buffers, Texturas, Objetos de buffer de vértice, Objetos de matriz de vértice, Objetos de buffer de quadro e assim por diante. Com um pouco de trabalho, você pode agrupar as aulas em torno deles. Ele também fornece uma maneira fácil de você voltar a funções obsoletas do OpenGL, se o seu contexto não suportar as extensões. Por exemplo, um VertexBufferObject pode voltar a usar glBegin (), glVertex3f () e assim por diante.
Existem algumas maneiras de você precisar se afastar dos conceitos tradicionais do OpenGL; por exemplo, você provavelmente deseja armazenar metadados sobre os buffers nos objetos de buffer. Por exemplo, se o buffer armazena vértices. Qual é o formato dos vértices (ou seja, posição, normais, cabos de texto e assim por diante). Quais primitivas ele usa (GL_TRIANGLES, GL_TRIANGLESTRIP, etc ...), informações de tamanho (quantos carros alegóricos são armazenados, quantos triângulos eles representam, etc ...). Apenas para facilitar a conexão deles nos comandos draw arrays.
Eu recomendo que você olhe para o OGLplus . São ligações C ++ para OpenGL.
Também glxx , isso é apenas para carregamento de extensões.
Além de agrupar a API do OpenGL, você deve criar um nível um pouco mais alto sobre ele.
Por exemplo, uma classe de gerente de materiais responsável por todos os shaders, carregando e usando-os. Também seria responsável por transferir propriedades para eles. Dessa forma, você pode simplesmente chamar: materials.usePhong (); material.setTexture (alguma textura); material.setColor (). Isso permite mais flexibilidade, já que você pode usar coisas mais recentes, como objetos de buffer uniforme compartilhado, para ter apenas um grande buffer contendo todas as propriedades que seus shaders usam em um bloco, mas se isso não for suportado, você volta a carregar em cada programa de shader. Você pode ter um grande shader monolítico e alternar entre diferentes modelos de shader usando rotinas uniformes, se houver suporte, ou pode voltar a usar vários shaders pequenos e diferentes.
Você também pode analisar as especificações GLSL para escrever seu código de sombreador. Por exemplo, o #include seria incrivelmente útil e muito fácil de implementar no código de carregamento do shader (também existe uma extensão ARB ). Você também pode gerar seu código rapidamente, com base em quais extensões são suportadas, por exemplo, usar um objeto uniforme compartilhado ou voltar a usar uniformes normais.
Finalmente, você desejará uma API de pipeline de renderização de nível superior que faça coisas como gráficos de cena, efeitos especiais (desfoque, brilho), coisas que exijam várias passagens de renderização, como sombras, iluminação e outras coisas. Além disso, uma API de jogo que não tem nada a ver com a API gráfica, mas apenas lida com objetos em um mundo.