Инстансное рисование динамических моделей в OpenGL

В настоящее время я разрабатываю фреймворк, который позволяет мне удобно отображать большее количество анимированных моделей.

Модель организована как простая иерархия костей, корнем которой обычно является туловище/таз :

My simple modeling hierarchy

. Итак, в качестве псевдокода я сейчас визуализирую вот такую ​​модель:

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, я могу указать только матрицу, связанную с экземпляром -, но не матрицу, связанную с костью -. Как мне применить преобразования костей?

Единственное возможное решение, которое я мог придумать, это -вместо создания экземпляра всей модели -я могу создать экземпляр каждой кости. Таким образом, отрисовывая все экземпляры одного типа кости, затем другого и т. д. Но тогда мне все равно придется обновлять буфер с матрицами преобразования относительно часто, и это больше служебный код.

Так это лучший лучший вариант? Или, в более общем плане, лучше ли -не слишком -усложнять способы передачи? Или инстансный рендеринг действительно хорош только при использовании его со статической геометрией?

5
задан genpfault 14 September 2012 в 16:20
поделиться