给定
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;
我通过从start_index
到start_index + length
cubeIndices
遍历每个索引来渲染集合中的每个FaceGroup
,如下所示:
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);
但它似乎只呈现每组面孔中的第一个(*试探性分析,我可能是错的)。我做错了什么?
glVertexAttribI1ui (attribIndex, cubeIndices [i->start_index + ix]);
glVertexAttribPointer (attribIndex
这些不做同样的事情。
奇怪的是,你知道像glVertexAttribI*
这样的深奥函数,但不知道在创建整型数组时需要使用glVertexAttribIPointer
。如果使用 glVertexAttribPointer
,则会传输浮点值;提供的任何整数值都将转换为浮点数(这就是为什么glVertexAttribPointer
有一个参数来指示它是否被规范化)。
所以你应该使用 glVertexAttribIPointer
.除非您将着色器更改为使用 float
而不是 uint
的输入attribIndex
。