Ich erstelle einen Renderer mit modernem OpenGL (3.1 und höher) und versuche jetzt, eine effiziente, aber flexible Methode für den Umgang mit Uniformen zu erstellen. Ich habe mich über einheitliche Pufferobjekte informiert und darüber, wie diese häufig verwendet werden (letzteres hat mir leider nicht so viele Ergebnisse gebracht, wie ich gehofft hatte).
Um OpenGL-API-Aufrufe zu reduzieren und Daten im zusammenhängenden Speicher zu speichern, erwäge ich, für jede Datenstruktur, die auf die GPU hochgeladen werden soll, mehrere große Puffer zu erstellen. Jeder Puffer hat eine maximale Größe von 16 KB (soweit ich weiß, ist so viel für einen UBO garantiert verfügbar). Wenn ein Objekt Uniformen auf die GPU hochladen möchte, ruft es den ersten Puffer des hochzuladenden Typs ab, der noch nicht voll ist, und erhält den nächsten verfügbaren Index in diesem Puffer. Wenn das Objekt gezeichnet wird, bindet es das UBO (falls noch nicht gebunden) und lädt den Elementindex des UBO hoch.
Dies führt zu ungefähr so:
layout(std140) uniform ModelData {
mat4 model_matrix[kNumInstancesPerModelUbo];
}
uniform int u_ModelDataIndex;
layout(std140) uniform SkeletonData {
mat4 bone_transforms[kNumInstancesPerSkeletonUbo][kMaxBones];
}
uniform int u_SkeletonDataIndex;
Ich denke jedoch auch über Folgendes nach:
layout(std140) uniform MeshData {
mat4 model_matrix[kNumInstancesPerMeshUbo];
mat4 bone_transforms[kNumInstancesPerMeshUbo][kMaxBones];
}
uniform int u_MeshDataIndex;
In mancher Hinsicht fühlt sich dies viel sauberer an, da ein einziger Index erforderlich ist, um auf alle Daten zuzugreifen, die sich auf das hochzuladende Netz beziehen. Auf der anderen Seite kann dies außer Kontrolle geraten (Puffergröße größer als 16 KB, Verarbeitung irrelevanter Daten (z. B. ein Netz ohne Skelett) oder sogar Synchronisierungsprobleme, da Sie beim Hochladen der Modellmatrizen keinen Zugriff auf die Knochen haben). und ich bin mir auch nicht sicher, wie sich dies auf das Speicherlayout auf der GPU auswirken würde.
Ehrlich gesagt fühlt es sich so an, als ob ich hier festsitze und ich kann kein gutes konkretes Beispiel dafür finden, wie Sie schnell und flexibel mit UBOs umgehen würden.
Haben Sie Ratschläge oder Ressourcen für mich, die mir hier helfen könnten?