3

私は 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());
}
4

1 に答える 1

1

Oké、glslDevil経由GL_INVALID_OPERATIONでボーンマトリックスをシェーダーに設定するときに連続エラーに遭遇しましたglUniformMatrix。問題の原因は、プログラムが情報をシェーダーに渡す段階にありました。

glUniformMatrix3fの代わりに を使用しているので、実際にはかなりばかげた間違いですglUniformMatrix4f。これを変更することで実際に問題が解決し、アニメーションは現在完全に機能しています.

于 2013-12-28T13:24:31.570 に答える