Je crée un moteur de rendu en utilisant OpenGL moderne (3.1 et plus) et maintenant j'essaye de créer une manière efficace mais flexible de gérer les uniformes. J'ai lu sur des objets tampons uniformes et sur ce qu'est une approche `` commune '' pour les utiliser (ce dernier ne m'a malheureusement pas donné autant de résultats que je l'espérais).
Afin de réduire les appels d'API OpenGL et de stocker des données dans une mémoire contiguë, j'envisage de créer plusieurs grands tampons pour chaque structure de données qui devrait être téléchargée sur le GPU. Chaque tampon a une taille maximale de 16 ko (d'après ce que je comprends, il est garanti que ce sera disponible pour un UBO). Lorsqu'un objet veut pouvoir télécharger des uniformes sur le GPU, il récupère le premier tampon du type à télécharger qui n'est pas encore plein et obtient le prochain index disponible dans ce tampon. Lorsque l'objet est dessiné, il lie l'UBO (s'il n'est pas encore lié) et télécharge l'index d'élément de l'UBO.
Cela se traduit par quelque chose comme ceci:
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;
Cependant, je considère également les éléments suivants:
layout(std140) uniform MeshData {
mat4 model_matrix[kNumInstancesPerMeshUbo];
mat4 bone_transforms[kNumInstancesPerMeshUbo][kMaxBones];
}
uniform int u_MeshDataIndex;
À certains égards, cela semble beaucoup plus propre, car il faut un seul index pour accéder à toutes les données liées au maillage à télécharger. D'un autre côté, cela pourrait devenir incontrôlable (taille du tampon supérieure à 16 Ko, gère les données non pertinentes (par exemple, un maillage sans squelette) ou même des problèmes de synchronisation car vous n'êtes pas autorisé à dire les os lors du téléchargement des matrices de modèle) et je ne sais pas non plus comment cela affecterait la disposition de la mémoire sur le GPU.
Franchement, j'ai l'impression d'être coincé ici et je ne peux pas trouver un bon exemple concret de la façon dont vous aborderiez la gestion rapide et flexible des UBO.
Avez-vous des conseils ou des ressources pour moi qui pourraient m'aider ici?