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我通过循环遍历cubeIndicesfrom中的每个索引start_index来渲染集合中的每一个,start_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,则传输浮点值;提供的任何整数值都将转换为浮点数(这就是为什么glVertexAttribPointer有一个参数告诉它是否被规范化)。

所以你应该使用glVertexAttribIPointer. 除非您将着色器更改为使用 afloat而不是uintforattribIndex的输入。

于 2012-09-17T15:00:34.313 回答