OpenGL enthält bereits einige 'Object'-Konzepte.
Zum Beispiel kann alles mit einer ID als Objekt durch sein (es gibt auch Dinge, die speziell als "Objekte" bezeichnet werden). Puffer, Texturen, Vertex-Pufferobjekte, Vertex-Array-Objekte, Frame-Pufferobjekte usw. Mit ein wenig Arbeit können Sie Klassen um sie wickeln. Es gibt Ihnen auch eine einfache Möglichkeit, auf veraltete OpenGL-Funktionen zurückzugreifen, wenn Ihr Kontext die Erweiterungen nicht unterstützt. Beispielsweise könnte ein VertexBufferObject auf die Verwendung von glBegin (), glVertex3f () usw. zurückgreifen.
Es gibt einige Möglichkeiten, sich von den herkömmlichen OpenGL-Konzepten zu entfernen. Beispielsweise möchten Sie wahrscheinlich Metadaten zu den Puffern in den Pufferobjekten speichern. Zum Beispiel, wenn der Puffer Eckpunkte speichert. Was ist das Format der Eckpunkte (dh Position, Normalen, Texkoordinaten usw.)? Welche Grundelemente werden verwendet (GL_TRIANGLES, GL_TRIANGLESTRIP usw.), Größeninformationen (wie viele Floats sind gespeichert, wie viele Dreiecke repräsentieren sie usw.). Nur um es einfacher zu machen, sie in die Befehle zum Zeichnen von Arrays zu stecken.
Ich empfehle Ihnen, sich OGLplus anzuschauen . Es sind C ++ - Bindungen für OpenGL.
Auch glxx , das ist allerdings nur für das Laden von Erweiterungen.
Zusätzlich zum Umschließen der OpenGL-API sollten Sie einen etwas höheren Build darüber erstellen.
Zum Beispiel eine Materialmanagerklasse, die für alle Ihre Shader verantwortlich ist, die sie laden und verwenden. Es wäre auch verantwortlich für die Übertragung von Eigenschaften an sie. Auf diese Weise können Sie einfach Folgendes aufrufen: materials.usePhong (); material.setTexture (sometexture); material.setColor (). Dies ermöglicht mehr Flexibilität, da Sie neuere Dinge wie gemeinsame einheitliche Pufferobjekte verwenden können, um nur einen großen Puffer mit allen Eigenschaften, die Ihre Shader verwenden, in einem Block zu haben. Falls dies nicht unterstützt wird, können Sie auf das Hochladen in jedes Shaderprogramm zurückgreifen. Sie können einen großen monolithischen Shader verwenden und mithilfe einheitlicher Routinen zwischen verschiedenen Shader-Modellen wechseln, sofern dies unterstützt wird, oder auf mehrere kleine Shader zurückgreifen.
Sie können auch die Ausgaben in den GLSL-Spezifikationen zum Schreiben Ihres Shader-Codes überprüfen. Zum Beispiel wäre #include unglaublich nützlich und sehr einfach in Ihren Shader-Lade-Code zu implementieren (es gibt auch eine ARB-Erweiterung dafür). Sie können Ihren Code auch im laufenden Betrieb generieren, indem Sie festlegen, welche Erweiterungen unterstützt werden. Verwenden Sie beispielsweise ein gemeinsam genutztes einheitliches Objekt oder greifen Sie auf normale Uniformen zurück.
Schließlich möchten Sie eine übergeordnete Rendering-Pipeline-API, die Szenengraphen, Spezialeffekte (Unschärfe, Glühen) und Dinge, die mehrere Rendering-Durchgänge erfordern, wie Schatten, Beleuchtung und dergleichen, ausführt. Hinzu kommt eine Spiel-API, die nichts mit der Grafik-API zu tun hat, sondern sich nur mit Objekten in einer Welt befasst.