В настоящее время я разрабатываю фреймворк, который позволяет мне удобно отображать большее количество анимированных моделей.
Модель организована как простая иерархия костей, корнем которой обычно является туловище/таз :
. Итак, в качестве псевдокода я сейчас визуализирую вот такую модель:
RenderBone(Bone b, Mat4x4 currentTransform){
Mat4x4 pos = currentTransform * b.boneTransform;
SetUniform("transformation", pos);
Draw(bone.mesh);
for each Bone bc in b.children do{
RenderBone(bc, pos);
}
}
Таким образом, для одного актера, который использует модель с n костями, мне нужно n SetUniform (, не считая таких вещей, как установка текстур )и n вызовов отрисовки.
Пытаясь уменьшить эти накладные расходы и одновременно отображать всех актеров с использованием одной и той же модели, я подумал о переходе на инстансный рендеринг.
Однако вся информация и учебные пособия, которые я смог найти, посвящены рисованию кубов, сфер или подобных простых объектов. Нигде я не мог найти простой и понятной информации о том, как использовать отрисовку экземпляров для рендеринга моделей, где каждая часть (кость )требует, чтобы шейдеру передавалась отдельная матрица преобразования.
Итак, задача :Используя glVertexAttribDivisor
или gl_InstanceID
, я могу указать только матрицу, связанную с экземпляром -, но не матрицу, связанную с костью -. Как мне применить преобразования костей?
Единственное возможное решение, которое я мог придумать, это -вместо создания экземпляра всей модели -я могу создать экземпляр каждой кости. Таким образом, отрисовывая все экземпляры одного типа кости, затем другого и т. д. Но тогда мне все равно придется обновлять буфер с матрицами преобразования относительно часто, и это больше служебный код.
Так это лучший лучший вариант? Или, в более общем плане, лучше ли -не слишком -усложнять способы передачи? Или инстансный рендеринг действительно хорош только при использовании его со статической геометрией?