Проблемы с зачисткой сетки к скелету
Я писал модельера для популярной игры и начал заниматься анимацией. Скелет / анимация хранятся в двоичном файле Havok, который я загружаю и анимирую с помощью движка Havok. Затем анимированные костные матрицы отправляются в шейдер GLSL для снятия кожи.
Вот как выглядит шейдер:
#version 150
precision highp float;
uniform mat4 uModelMatrix;
uniform mat4 uViewMatrix;
uniform mat4 uProjMatrix;
uniform int uNumBones;
uniform mat4 uBones[252];
attribute vec4 aPosition;
attribute vec4 aNormal;
attribute vec4 aTexCoord;
attribute vec4 aColor;
attribute vec4 aBiTangent;
attribute ivec4 aBlendWeight;
attribute ivec4 aBlendIndex;
varying vec4 vPosition;
varying vec4 vNormal;
varying vec4 vTexCoord;
varying vec4 vColor;
varying mat4 vTBNMatrix;
varying vec3 vLightDir;
varying vec3 vEyeVec;
void main(void) {
vec4 transformedPosition = vec4(0.0);
vec3 transformedNormal = vec3(0.0);
ivec4 curIndex = aBlendIndex;
ivec4 curWeight = aBlendWeight;
vec4 pos = aPosition;
for (int i = 0; i < 4; i++)
{
mat4 m44 = uBones[curIndex.x];
// transform the offset by bone i
transformedPosition += m44 * pos * (curWeight.x/255.0);
// shift over the index/weight variables, this moves the index and
// weight for the current bone into the .x component of the index
// and weight variables
curIndex = curIndex.yzwx;
curWeight = curWeight.yzwx;
}
gl_Position = uProjMatrix * uViewMatrix * uModelMatrix * transformedPosition ;
}
Веса хранятся в формате DirectX UBYTE4N, поэтому я отправляю их в шейдер в виде целых чисел и делю на 255,0, чтобы получить истинный результат.
Как ни странно, именно так должна выглядеть эталонная поза (к сетке не применяется операция снятия шкурки, красные точки - только перевод отдельных костей):
Вместо этого я получаю:
Модель подражает и выглядит
http://ffxiv.consolegameswiki.com/images/thumb/e/e6/Treasure_box2.jpg/400px-Treasure_box2.jpg
Этот шейдер выглядит правильно? Что может вызвать эту проблему?