Die niedrigste Ebene, die aus meiner Sicht sinnvoll ist, befasst sich mit den Ressourcen, die beim Rendern erforderlich sind - vb / ib, Renderoberflächen, Texturen, Shader, Statusblöcke usw.
Das Problem hierbei ist, dass einige davon je nach API in unterschiedlichen Formaten vorliegen müssen - dort wird es etwas schwierig. Der einfachste Weg, dies zu umgehen, besteht darin, statische Ressourcen für die jeweilige API vorzuverarbeiten. Verwenden Sie für dynamische Shader nur Shader, um sie zu generieren. Dies macht es ziemlich einfach, in nativen Formaten zu bleiben.
Alles, was Sie dann auf der höheren Ebene tun, ist, Pipelines mit angehängten Ressourcen einzurichten und diese an die GPU zu übergeben. Sie werden feststellen, dass nicht alles auf diese Weise gut abstrahiert werden kann, insbesondere wenn Sie hardwarespezifische Tricks nutzen. Aber es ist ein guter Anfang.
(Nebenbemerkung: Wenn Sie plattformspezifische Tricks als eine besondere Art von Ressource behandeln, können Sie dieses gesamte Konzept ziemlich weit treiben.)
In gewisser Weise erstellen Sie zwei Dinge: einen Hardware-Ressourcenmanager sowie ein Toolkit zum Einrichten einer DAG dieser Ressourcen.