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

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

问题描述:

我花了半天的时间试图解决这个问题,但目前为止我还没有运气,所以我正在寻找一些建议和指导。适用于iOS的OpenGLES - glBufferData() - GLuint不适用于数据字段

我在我的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位iPad 3上,没有出现任何东西(除非我使用GLubyte,它没有渲染只有256个索引的完整球体)。

那么,为什么在传递索引数组时glBufferData()没有“GLuint”?怎么只有“GLubyte”会起作用?

预先感谢您。这让我疯狂。

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

限制是ES 2.0不支持GL_UNSIGNED_INT作为索引类型。 man page

指定索引中值的类型。必须是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()的“类型”参数,相应的值为GL_UNSIGNED_SHORT。这给你一个65,536指数的范围。

+0

啊,我明白了。谢谢! – TATN 2014-11-01 21:43:15

与此同时,要解决此问题,我使用GL_ARRAY_BUFFER而不是GL_ELEMENT_ARRAY_BUFFER来渲染球体,并且它工作得很好。缩小规模是我需要缓冲更多的顶点,而不是使用索引。