私は ASSIMP スケルタルアニメーションローダーとレンダラーに取り組んでおり、現在、すべてのデータが正しく読み込まれ、現在の時間枠で補間されています。ただし、まだ正常に機能していない部分が 1 つあります。それが頂点シェーダー ステージです。
VBOを介してvec4
、ボーン ID と各頂点の重み (頂点ごとに最大4 つのボーン/重み)を含む2 つの を渡し、頂点シェーダーには100 個のボーン変換 (フレームごとに事前計算) のマトリックス配列があります) ボーン ID によってインデックス化されます。
ただし、ボーン ユニフォームには適切な変換が含まれていないようです。デバッグの目的で、重みの値とボーン ID の値を使用してモデルに色を付けました。これらには色 (したがって有効な値) が含まれています。ただし、ボーン変換によって頂点を変換し、その結果でモデルに色を付けると、モデル全体が黒くなります。つまり、変換行列はすべて0.0
. したがって、それらは適切に初期化されていません。
問題は、マトリックスをユニフォーム配列に渡すこと、またはおそらくユニフォームの最大サイズにあると思います(ユニフォームマトリックスの数を32(現在のモデルのボーンの数)に設定しようとしましたが、効果はありませんでした)?
情報をシェーダーに渡す前に、変換マトリックスは実際に有効なマトリックス (ID/空のマトリックスではない) であるため、障害はおそらく GLSL シェーダーまたはユニフォームの受け渡しにあるはずです。
次のコードは、頂点シェーダーからのものです。
#version 330
layout (location = 0) in vec3 position;
layout(location = 1) in vec3 normal;
layout(location = 2) in vec3 tangent;
layout(location = 3) in vec3 color;
layout(location = 4) in vec2 texCoord;
layout(location = 5) in ivec4 boneIDs;
layout(location = 6) in vec4 weights;
uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;
uniform mat4 bones[100];
out vec2 TexCoord;
out vec4 colorz;
void main()
{
vec4 newPos = vec4(position, 1.0);
colorz = vec4(0.0, 1.0, 0.0, 1.0);
if (weights != vec4(0.0, 0.0, 0.0, 0.0))
{
mat4 boneTransform = bones[boneIDs[0]] * weights[0];
boneTransform += bones[boneIDs[1]] * weights[1];
boneTransform += bones[boneIDs[2]] * weights[2];
boneTransform += bones[boneIDs[3]] * weights[3];
// newPos = boneTransform * vec4(position, 1.0);
vec4 test = vec4(1.0);
colorz = boneTransform * test;
// newPos = boneTransform * newPos;
}
TexCoord = texCoord;
gl_Position = projection * view * model * newPos;
}
次のコード スニペットは、マトリックス データを GLSL シェーダーに渡します。
// Sets bone transformation matrices
void Shader::SetBoneMatrix(GLint index, aiMatrix4x4 matrix)
{
glm::mat4 mat = glm::transpose(glm::make_mat4(&matrix.a1));
glUniformMatrix3fv(boneLocations[index], 1, GL_FALSE, glm::value_ptr(mat));
}
また、ボーン配列のすべての均一な位置を取得するコード:
for(unsigned int i = 0; i < 100; i++)
{
string name = "bones[";
string number;
stringstream ss;
ss << i;
ss >> number;
name += number;
name += ']';
boneLocations[i] = glGetUniformLocation(this->program, name.c_str());
}