Я создаю рендерер с использованием современного OpenGL (версии 3.1 и выше), и теперь я пытаюсь создать эффективный, но гибкий способ обработки униформы. Я читал об объектах с единым буфером и о том, что такое «общий» подход к их использованию (последний, к сожалению, дал не так много результатов, как я надеялся).
Чтобы уменьшить количество вызовов API OpenGL и хранить данные в непрерывной памяти, я рассматриваю возможность создания нескольких больших буферов для каждой структуры данных, которая должна быть загружена в графический процессор. Максимальный размер каждого буфера составляет 16 КБ (насколько я понимаю, многое гарантировано будет доступно для UBO). Когда объект хочет иметь возможность загружать униформу в графический процессор, он выбирает первый буфер того типа, который должен быть загружен, который еще не заполнен, и получает следующий доступный индекс в этом буфере. Когда объект рисуется, он связывает UBO (если еще не привязан) и загружает индекс элемента UBO.
Это приводит к чему-то вроде этого:
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;
Однако я также рассматриваю следующее:
layout(std140) uniform MeshData {
mat4 model_matrix[kNumInstancesPerMeshUbo];
mat4 bone_transforms[kNumInstancesPerMeshUbo][kMaxBones];
}
uniform int u_MeshDataIndex;
В некотором смысле это выглядит намного чище, поскольку для доступа ко всем данным, связанным с загружаемой сеткой, требуется один индекс. С другой стороны, это может выйти из-под контроля (размер буфера больше 16 КБ, обрабатывает нерелевантные данные (например, меш без скелета) или даже проблемы с синхронизацией, поскольку у вас нет доступа к произнесению костей при загрузке матриц модели) и я не уверен, как это повлияет на расположение памяти на GPU.
Честно говоря, мне кажется, что я застрял здесь, и я не могу найти хороший конкретный пример того, как бы вы справились с быстрой и гибкой работой UBO.
Есть ли у вас какие-либо советы или ресурсы для меня, которые могли бы помочь мне здесь?