适用于iOS的OpenGLES - glBufferData() - GLuint不适用于数据字段

时间:2014-11-01 06:19:01

标签: ios opengl-es-2.0

我花了半天的时间试图解决这个问题,但到目前为止我没有运气,所以我正在寻找一些建议和指导。

我在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"会工作吗?

提前谢谢你。这让我疯了。

2 个答案:

答案 0 :(得分:1)

问题不在于glBufferData()。您可以将GLuint值存储在缓冲区中。

限制是ES 2.0不支持GL_UNSIGNED_INT作为索引类型。从"类型"的描述man pageglDrawElements()的参数:

  

指定索引中值的类型。必须是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_SHORTglDrawElements()的论点。这为您提供了65,536个指数范围。

答案 1 :(得分:0)

同时,要解决此问题,我使用GL_ARRAY_BUFFER而不是GL_ELEMENT_ARRAY_BUFFER来渲染球体,它可以正常工作。缩小尺寸是我需要缓冲比使用索引更多的顶点。