我花了半天时间试图解决这个问题,但到目前为止我运气不佳,所以我正在寻求一些建议和指导。
我正在我的32位iPad3(iOS 8)上渲染一个球体。
-(void) bufferVBO :(objectVertex[])objVertices :(int)objectVerticesSize
:(GLubyte[])vertexIndices :(int)vertexIndicesSize
{
...
glBufferData(GL_ELEMENT_ARRAY_BUFFER, vertexIndicesSize, vertexIndices, GL_STATIC_DRAW);
...
}
这很好。然而,这只会渲染多达256个索引(因为GLubyte只有8位),所以我需要更多的索引来渲染球体。
然而,当我尝试这样做时(注意第三个参数从"GLubyte"变为"GLunit"):
-(void) bufferVBO :(objectVertex[])objVertices :(int)objectVerticesSize
:(GLuint[])vertexIndices :(int)vertexIndicesSize
{
...
glBufferData(GL_ELEMENT_ARRAY_BUFFER, vertexIndicesSize, vertexIndices, GL_STATIC_DRAW);
...
}
这行不通。我的屏幕上没有显示任何内容。在(Mac)桌面应用程序上,我可以传入GLuint来渲染我的球体,没有问题。但是,在我的32位iPad3上,什么都没有显示(除非我使用GLubyte,它没有呈现只有256个索引的完整球体)。
那么,在传递索引数组时,为什么"GLuint"不适用于glBufferData()呢?为什么只有"GLubyte"才能工作?
提前谢谢。这把我逼疯了。
问题不在glBufferData()
。您可以将GLuint
值存储在缓冲区中。
限制是ES 2.0不支持GL_UNSIGNED_INT
作为索引类型。根据手册页上对glDrawElements()
"类型"参数的描述:
指定索引中值的类型。必须是GL_UNSIGNED_BYTE或GL_UNSIGNED_SHORT。
ES 3.0和OpenGL完全支持GL_UNSIGNED_INT
。ES 1.x和2.0还有一个扩展,允许实现支持它:OES_element_index_uint。
在ES 2.0中,可以将GLushort
类型用于索引,glDrawElements()
的"type"参数对应的值为GL_UNSIGNED_SHORT
。这为您提供了65536个索引的范围。
同时,为了解决这个问题,我使用GL_ARRAY_BUFFER而不是GL_ELEMENT_ARRAY.BUFFER来渲染球体,而且效果很好。缺点是我需要缓冲比使用索引更多的顶点。