ココアとOpenGLは、どのように配列を使用してGLSLの頂点属性を設定するには?
-
21-09-2019 - |
質問
私は、OpenGLにかなり新たなんだ、と私はいくつかの困難を経験しているように見えます。私はシンプルな骨格のアニメーションを可能にし、与えられた関節の行列で頂点を変換することになっているGLSLでシンプルなシェーダを、書きました。各頂点は、2つの骨の影響(x及びVEC2のy成分として格納されている)、変換行列のアレイに関連付けられているインデックスと対応する重みの最大値を有し、その後に設定私のシェーダで「属性変数」として指定されています"glVertexAttribPointer" 機能を使用します。
問題が発生した場合、私はシェーダでそれらの値をチェックするとき、ここで...私は、適切行列の「制服変数」のアレイを設定するために管理しています、それらのすべてが正しくインポートされていると、彼らは正しいデータが含まれています。私は共同インデックス変数を設定しようとしたときしかし、頂点が任意の変換行列を掛けています!彼らは私がインデックスが正しく設定されていて、私のシェーダは、以下のメモリに私の共同マトリクス配列の末尾を越えて読んでいると仮定しています。このから(毎回異なる)空間で、一見ランダムな位置にジャンプします。私は、件名に見つけることができるすべての情報を読んだとき、私は同じことを見て驚いたので(非常に類似していない場合)、私は彼らの例では、コードを正確にわからなぜないんだけど、それは彼らのために仕事に思えました。
私は今、かなりの時間のために、この問題を解決しようと試みてきた、本当に私の神経に取得し始めています...私は行列が正しいことを知っている、と私は手動で任意の整数にシェーダのインデックス値を変更するとき、それが正しい行列値を読み取り、それは、その行列によってすべての頂点を変換する必要があるように動作しますが、私は、私は属性変数を設定するために書いたコードを試してみて、使用するときに、それが動作するようには思えません。
次のように私は、変数を設定するために使用していたコードがある...
// 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);
}
これは本当に私を失望し始めている、と任意およびすべてのヘルプは理解されるであろう、
-Andrew Gotow
解決
[OK]を、私はそれを考え出しました。 OpenGLは、三角形(3つの成分をそれぞれ有する3つの頂点)としてすべての9つの値を読み取ることによってdrawArrays機能付き三角形を描きます。隣接する二つの三角形が頂点を共有する場合、それは配列で二回まで来るのでこのため、頂点は、三角形の間repepatedされています。私はもともと8つの頂点を思っていた私のキューブので、実際には36を持っています!
六面、二つの三角形面、三角形当たり3つの頂点、36個の独立した頂点の代わりに8つの共有ものの合計うち全て乗算
全体の問題は、あまりにもいくつかの値を指定すると問題でした。私は36個の値を含めるように私のテストアレイを拡張するとすぐに、それは完全に働いています。