2014-11-01 57 views
2

我花了半天的時間試圖解決這個問題,但目前爲止我還沒有運氣,所以我正在尋找一些建議和指導。適用於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」會起作用?

預先感謝您。這讓我瘋狂。

回答

1

問題不在於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

0

與此同時,要解決此問題,我使用GL_ARRAY_BUFFER而不是GL_ELEMENT_ARRAY_BUFFER來渲染球體,並且它工作得很好。縮小規模是我需要緩衝更多的頂點,而不是使用索引。