适用于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位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来渲染球体,而且效果很好。缺点是我需要缓冲比使用索引更多的顶点。

最新更新