1

与えられた

std::vector<GLuint> cubeIndices;
struct FaceGroup {
    unsigned int face_index;
    unsigned int start_index;
    size_t length;
    // comparison operators omitted
};
std::set<FaceGroup>::iterator i;
GLuint attribIndex;

私は、各インデックスをからのようFaceGroupにループすることによって、セット内のそれぞれをレンダリングしていました。cubeIndicesstart_indexstart_index + length

for (unsigned ix = 0; ix < i->length; ++ix) {
    glDisableVertexAttribArray (attribIndex);
    glVertexAttribI1ui (attribIndex, cubeIndices [i->start_index + ix]);
    glDrawElements (GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_INT, (void*) (i->face_index * sizeof (GLuint)));
}

...これで正しい結果が得られます。次に、インスタンス化された配列を使用して同じものをレンダリングしたいと思います。私の推論によると、次のコードは上記のループと同等です。

glEnableVertexAttribArray (attribIndex);
glVertexAttribDivisorARB (attribIndex, 1);
glVertexAttribPointer (attribIndex, 1, GL_UNSIGNED_INT, GL_FALSE, sizeof (GLuint), &cubeIndices [i->start_index]);
glDrawElementsInstancedARB (GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_INT, (void*) (i->face_index * sizeof (GLuint)), i->length);

しかし、それは顔の各グループの最初のものだけをレンダリングするようです(*暫定的な分析、私は間違っているかもしれません)。私は何が間違っているのですか?

4

1 に答える 1

1
glVertexAttribI1ui (attribIndex, cubeIndices [i->start_index + ix]);
glVertexAttribPointer (attribIndex

これらは同じことをしません。

のような難解な関数を知っていても、積分配列を作成するときglVertexAttribI*に使用する必要があることを知らないのは不思議です。glVertexAttribIPointerを使用するglVertexAttribPointerと、浮動小数点値が転送されます。提供された整数値はすべてfloatに変換されます(これが、glVertexAttribPointer正規化されているかどうかを示すパラメーターがある理由です)。

したがって、を使用する必要がありますglVertexAttribIPointer。forの入力のfloat代わりにシェーダーを使用するようにシェーダーを変更しない限り。uintattribIndex

于 2012-09-17T15:00:34.313 に答える