私はOpenGLにかなり慣れていないので、いくつかの問題が発生しているようです。GLSLで単純なシェーダーを作成しました。これは、指定されたジョイントマトリックスによって頂点を変換し、単純なスケルタルアニメーションを可能にすることになっています。各頂点には、最大2つのボーンインフルエンス(Vec2のxおよびyコンポーネントとして格納)、変換行列の配列に関連付けられたインデックスおよび対応する重みがあり、シェーダーで「属性変数」として指定され、設定されます。 「glVertexAttribPointer」関数を使用します。
ここで問題が発生します...行列の「UniformVariable」配列を適切に設定できました。シェーダーでこれらの値を確認すると、すべてが正しくインポートされ、正しいデータが含まれています。ただし、ジョイントインデックス変数を設定しようとすると、頂点に任意の変換行列が乗算されます。これらは、空間内のランダムな位置(毎回異なる)にジャンプします。これは、インデックスが正しく設定されておらず、シェーダーがジョイントマトリックス配列の終わりを超えて次のメモリに読み取っていると想定しています。理由はよくわかりません。このテーマについて見つけたすべての情報を読んだときに、同じ(あまり似ていない場合でも)コードが例に含まれているのを見て驚いたのですが、それはうまくいったようです。
私はかなり前からこの問題を解決しようとしましたが、本当に神経質になり始めています...行列が正しいことはわかっています。シェーダーのインデックス値を手動で任意の整数に変更すると、次のようになります。正しい行列値と正常に機能し、すべての頂点をその行列で変換しますが、作成したコードを使用して属性変数を設定しようとすると、機能しないようです。
変数を設定するために使用しているコードは次のとおりです...
// this works properly...
GLuint boneMatLoc = glGetUniformLocation([[[obj material] shader] programID], "boneMatrices");
glUniformMatrix4fv( boneMatLoc, matCount, GL_TRUE, currentBoneMatrices );
GLfloat testBoneIndices[8] = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};
// this however, does not...
GLuint boneIndexLoc = glGetAttribLocation([[[obj material] shader] programID], "boneIndices");
glEnableVertexAttribArray( boneIndexLoc );
glVertexAttribPointer( boneIndexLoc, 2, GL_FLOAT, GL_FALSE, 0, testBoneIndices );
そして、私の頂点シェーダーは次のようになります...
// this shader is supposed to transform the bones by a skeleton, a maximum of two
// bones per vertex with varying weights...
uniform mat4 boneMatrices[32]; // matrices for the bones
attribute vec2 boneIndices; // x for the first bone, y for the second
//attribute vec2 boneWeight; // the blend weights between the two bones
void main(void)
{
gl_TexCoord[0] = gl_MultiTexCoord0; // just set up the texture coordinates...
vec4 vertexPos1 = 1.0 * boneMatrices[ int(boneIndex.x) ] * gl_Vertex;
//vec4 vertexPos2 = 0.5 * boneMatrices[ int(boneIndex.y) ] * gl_Vertex;
gl_Position = gl_ModelViewProjectionMatrix * (vertexPos1);
}
これは本当に私を苛立たせ始めています、そしてどんなそしてすべての助けも感謝されるでしょう、
-アンドリュー・ゴトウ