OGeek|极客世界-中国程序员成长平台

标题: ios - OpenGLES for iOS - glBufferData() - GLuint 不适用于数据字段 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 02:59
标题: ios - OpenGLES for iOS - 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 个索引的完整球体)。

那么,为什么“GLuint”在传递索引数组时对 glBufferData() 不起作用?为什么只有“GLubyte”可以工作?

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



Best Answer-推荐答案


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

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

Specifies the type of the values in indices. Must be GL_UNSIGNED_BYTE or 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 个索引的范围。

关于ios - OpenGLES for iOS - glBufferData() - GLuint 不适用于数据字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26686731/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://ogeek.cn/) Powered by Discuz! X3.4