6

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

これは本当に私を苛立たせ始めています、そしてどんなそしてすべての助けも感謝されるでしょう、

-アンドリュー・ゴトウ

4

1 に答える 1

2

わかりました、私はそれを理解しました。OpenGLは、drawArrays関数を使用して、9つの値ごとに三角形(それぞれ3つのコンポーネントを持つ3つの頂点)を読み取ることにより、三角形を描画します。このため、頂点は三角形間で繰り返されるため、2つの隣接する三角形が頂点を共有する場合、頂点は配列内で2回表示されます。つまり、元々8つの頂点があると思っていた私の立方体には、実際には36の頂点があります。

6つの辺、1つの三角形、1つの三角形ごとに3つの頂点、すべてが8つの共有頂点ではなく、合計36の独立した頂点に乗算されます。

全体の問題は、指定する値が少なすぎるという問題でした。テスト配列を拡張して36個の値を含めるとすぐに、完全に機能しました。

于 2009-12-31T02:20:12.063 に答える