OpenGL ha già alcuni concetti "Object".
Ad esempio, qualsiasi cosa con un ID può passare attraverso come oggetto (ci sono anche cose specificatamente chiamate "Oggetti"). Buffer, trame, oggetti buffer vertici, oggetti array vertici, oggetti frame buffer e così via. Con un po 'di lavoro puoi avvolgere le classi attorno a loro. Ti dà anche un modo semplice per tornare alle vecchie funzioni obsolete di OpenGL se il tuo contesto non supporta le estensioni. Ad esempio un oggetto VertexBuffer potrebbe ricorrere all'utilizzo di glBegin (), glVertex3f () e così via.
Esistono alcuni modi in cui potrebbe essere necessario allontanarsi dai concetti OpenGL tradizionali, ad esempio probabilmente si desidera archiviare metadati sui buffer negli oggetti buffer. Ad esempio se il buffer memorizza i vertici. Qual è il formato dei vertici (ovvero posizione, normali, texcoords e così via). Quali primitivi utilizza (GL_TRIANGLES, GL_TRIANGLESTRIP, ecc ...), informazioni sulla dimensione (quanti galleggianti sono memorizzati, quanti triangoli rappresentano, ecc ...). Giusto per semplificare il loro inserimento nei comandi degli array di disegno.
Ti consiglio di guardare OGLplus . Sono i collegamenti C ++ per OpenGL.
Anche glxx , questo è solo per il caricamento delle estensioni però.
Oltre a racchiudere l'API OpenGL, dovresti cercare di creare un livello leggermente superiore su di esso.
Ad esempio una classe di gestione dei materiali responsabile di tutti gli shader, caricandoli e utilizzandoli. Inoltre sarebbe responsabile per il trasferimento di proprietà a loro. In questo modo puoi semplicemente chiamare: materials.usePhong (); material.setTexture (sometexture); material.setColor (). Ciò consente una maggiore flessibilità poiché è possibile utilizzare elementi più recenti come gli oggetti buffer uniformi condivisi per avere solo 1 buffer di grandi dimensioni contenente tutte le proprietà utilizzate dagli shader in 1 blocco, ma se non è supportato, è possibile ricorrere al caricamento su ciascun programma shader. Puoi avere 1 grande shader monolitico e scambiare tra diversi modelli di shader usando routine uniformi se è supportato o puoi ricorrere all'utilizzo di un gruppo di diversi shader piccoli.
Puoi anche cercare di spendere dalle specifiche GLSL per scrivere il tuo codice shader. Ad esempio, #include sarebbe incredibilmente utile e molto facile da implementare nel codice di caricamento dello shader (è disponibile anche un'estensione ARB ). Puoi anche generare il tuo codice al volo in base alle estensioni supportate, ad esempio utilizzare un oggetto uniforme condiviso o ricorrere all'utilizzo di uniformi normali.
Infine, vorrai un'API della pipeline di rendering di livello superiore che esegua operazioni come grafici di scene, effetti speciali (sfocatura, bagliore), elementi che richiedono passaggi di rendering multipli come ombre, illuminazione e così via. Inoltre, un'API di gioco che non ha nulla a che fare con l'API grafica ma si occupa solo di oggetti in un mondo.