我花了半天的时间试图解决这个问题,但到目前为止我没有运气,所以我正在寻找一些建议和指导。
我在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"到#34; GLunit"在第3个参数)的变化:
-(void) bufferVBO :(objectVertex[])objVertices :(int)objectVerticesSize
:(GLuint[])vertexIndices :(int)vertexIndicesSize
{
...
glBufferData(GL_ELEMENT_ARRAY_BUFFER, vertexIndicesSize, vertexIndices, GL_STATIC_DRAW);
...
}
这不起作用。我的屏幕上没有任何渲染。在(Mac)桌面应用程序上,我能够传入GLuint来渲染我的球体没问题。但是,在我的32位iPad 3上,没有任何显示(除非我使用了GLubyte,它没有渲染一个只有256个索引的完整球体)。
那么,为什么没有" GLuint"传递一个索引数组时为glBufferData()工作?怎么只有" GLubyte"会工作吗?
提前谢谢你。这让我疯了。
答案 0 :(得分:1)
问题不在于glBufferData()
。您可以将GLuint
值存储在缓冲区中。
限制是ES 2.0不支持GL_UNSIGNED_INT
作为索引类型。从"类型"的描述man page上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
类型的索引,并为"类型"使用相应的值GL_UNSIGNED_SHORT
。 glDrawElements()
的论点。这为您提供了65,536个指数范围。
答案 1 :(得分:0)
同时,要解决此问题,我使用GL_ARRAY_BUFFER而不是GL_ELEMENT_ARRAY_BUFFER来渲染球体,它可以正常工作。缩小尺寸是我需要缓冲比使用索引更多的顶点。