Как передать вес скелета в вершинных шейдерах?

Я сделал C ++ Collada Reader, но я рисую анимированную сетку 3K за 4 мс, используя прямой режим opengl. Это слишком медленно.

Поэтому я решил использовать вершинный шейдер. В скелете у каждой вершины есть вес (ноль или более) для каждой кости.
Для сетки 3K с 40 костями у вас есть 120 000 весов для всего объекта.

Единственная проблема в GLSL — вы не можете объявлять однородные массивы больших размеров.

Например, это скомпилирует (вершинный шейдер):

///////////////////////////////////////////

uniform float weights [10] ;

void main (void)

{
float test= weights[0];

gl_Position = ftransform();

}

/// но не это:

uniform float weights [120000] ;

void main (void)

{
float test= weights[0];

gl_Position = ftransform();

}

//////////////////////////////////////////

Я видел на некоторых страницах, что я мог использовать glVertexAttribPointer (), чтобы установить атрибуты для каждой вершины. Это будет сделано, если у меня было от 1 до 4 костей (я мог бы использовать атрибуты vecX), но GLSL (в моем случае 1.20) не
принимать массивы атрибутов.

-1

Решение

Как упоминали Келтар и Андон М. Коулман, вы должны использовать атрибуты vec4.
В некоторых случаях некоторые вершины имеют более 4 костей, контролирующих их. Что вы можете сделать, так это просто рассмотреть кости с самым большим весом.

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector