Estou criando um renderizador usando o OpenGL moderno (3.1 e superior) e agora estou tentando criar uma maneira eficiente, mas flexível, de lidar com uniformes. Estive lendo sobre objetos de buffer uniformes e sobre o que é uma abordagem 'comum' para usá-los (infelizmente este último não me deu tantos resultados quanto eu esperava).
Para reduzir as chamadas à API do OpenGL e armazenar dados na memória contígua, estou pensando em criar vários buffers grandes para cada estrutura de dados que deve ser carregada na GPU. Cada buffer tem um tamanho máximo de 16kb (pelo que entendi, é garantido que isso esteja disponível para uma UBO). Quando um objeto deseja fazer o upload de uniformes para a GPU, ele busca o primeiro buffer do tipo a ser carregado que ainda não está cheio e obtém o próximo índice disponível nesse buffer. Quando o objeto é desenhado, ele vincula o UBO (se ainda não estiver vinculado) e carrega o índice do elemento do UBO.
Isso resulta em algo como isto:
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;
No entanto, também estou considerando o seguinte:
layout(std140) uniform MeshData {
mat4 model_matrix[kNumInstancesPerMeshUbo];
mat4 bone_transforms[kNumInstancesPerMeshUbo][kMaxBones];
}
uniform int u_MeshDataIndex;
De certa forma, isso parece muito mais limpo, pois é necessário um único índice para acessar todos os dados relacionados à malha a ser carregada. Por outro lado, isso pode ficar fora de controle (tamanho do buffer maior que 16kb, manipula dados irrelevantes (por exemplo, uma malha sem esqueleto) ou até mesmo problemas de sincronização, pois você não tem acesso permitido para dizer o que está fazendo enquanto carrega as matrizes do modelo. e não tenho certeza de como isso afetaria o layout da memória na GPU.
Francamente, parece que estou preso aqui e não consigo encontrar um bom exemplo concreto de como você lidaria com a UBO de forma rápida e flexível.
Você tem algum conselho ou recurso para mim que possa me ajudar aqui?