2011-07-28 64 views
8

我無法弄清楚如何在iphone的opengl es 2.0中爲我的地形使用頂點緩衝區對象。這是靜態數據,所以我希望通過使用VBO來提高速度。在常規的OpenGL中,我使用顯示列表和着色器沒有問題。然而,在opengl es 2.0中,我必須將頂點數據作爲屬性發送給着色器,並且不知道它如何與VBO一起工作。頂點緩衝區如何知道在什麼時候將頂點數據綁定到什麼屬性?這在opengl es 2.0中甚至可能嗎?如果沒有,有沒有其他方法可以優化靜態地形的渲染?OpenGL ES 2.0和頂點緩衝區對象(VBO)

回答

12

當然,這其實很簡單,你的屬性有一個位置,頂點數據饋送glVertexAttribPointer爲純頂點數組,像這樣:

float *vertices = ...; 
int loc = glGetAttribLocation(program, "position"); 
glVertexAttribPointer(loc, 3, GL_FLOAT, GL_FALSE, 0, vertices); 

對於維也納組織,它是相同的,但你必須將緩衝區綁定到GL_ARRAY_BUFFER目標,並且glVertexAttribPointer的最後一個參數現在是緩衝區內存存儲的偏移量。該指針值本身被解釋爲一個偏移量:

glBindBuffer(GL_ARRAY_BUFFER, buffer); 
int loc = glGetAttribLocation(program, "position"); 
glVertexAttribPointer(loc, 3, GL_FLOAT, GL_FALSE, 0, 0); 

在這種情況下,偏移量是0,假設頂點數據在緩衝區的開始上傳。偏移量是以字節爲單位的度量。

然後使用glDrawArrays/glDrawElements執行繪圖。希望這可以幫助!

+0

是的,這應該做我所需要的。我明天會嘗試。謝謝! – Nitrex88

+0

如果我能在第二個例子中找到如何處理'vertices',它可能會幫助我。一個主意? –

+1

@Stephane頂點應該使用glBufferData上傳到VBO。 –