Sto creando un renderer utilizzando OpenGL moderno (3.1 e versioni successive) e ora sto cercando di creare un modo efficiente ma flessibile di gestire le uniformi. Ho letto su oggetti buffer uniformi e su quale approccio "comune" è usare questi (purtroppo quest'ultimo non mi ha dato tutti i risultati sperati).
Al fine di ridurre le chiamate API OpenGL e l'archiviazione dei dati in memoria contigua, sto prendendo in considerazione la creazione di più buffer di grandi dimensioni per ogni struttura di dati che devono essere caricati nella GPU. Ogni buffer ha una dimensione massima di 16kb (come da quanto ho capito è garantito per essere disponibile per un UBO). Quando un oggetto vuole essere in grado di caricare uniformi nella GPU, recupera il primo buffer del tipo da caricare che non è ancora pieno e ottiene il successivo indice disponibile in quel buffer. Quando l'oggetto viene disegnato, lega l'UBO (se non ancora associato) e carica l'indice dell'elemento dell'UBO.
Ciò si traduce in qualcosa del genere:
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;
Tuttavia sto anche considerando quanto segue:
layout(std140) uniform MeshData {
mat4 model_matrix[kNumInstancesPerMeshUbo];
mat4 bone_transforms[kNumInstancesPerMeshUbo][kMaxBones];
}
uniform int u_MeshDataIndex;
In un certo senso questo sembra molto più pulito in quanto è necessario un singolo indice per accedere a tutti i dati relativi alla mesh da caricare. D'altra parte, ciò potrebbe sfuggire di mano (dimensioni del buffer maggiori di 16kb, gestione di dati irrilevanti (ad esempio una mesh senza scheletro) o problemi di sincronizzazione in quanto non è consentito l'accesso per dire le ossa durante il caricamento delle matrici del modello) e non sono sicuro di come ciò influenzerebbe il layout di memoria sulla GPU.
Francamente mi sembra di essere bloccato qui e non riesco a trovare un buon esempio concreto di come gestiresti la UBO in modo rapido e flessibile.
Hai qualche consiglio o risorsa per me che potrebbe aiutarmi qui?