2010-09-13 51 views
0

我有一個包含一堆對象的場景,例如讓我們說它是一個簡單的瓷磚網格。所以有一個主要的「邊界」對象,然後(行x列)單元格。在使用opengl-es的Android上,我應該將所有glVertexPointer數據放入一個緩衝區嗎?

爲簡單起見,假設每個單元格都是一個由四節點GL_LINE_LOOP組成的簡單四段線。

目前,我的幀速率awefull,它似乎在坐所有glVertexBuffer()調用我正在做,每個單元都有它自己的一套頂點,所以它自己的調用glVertexPointer:

class MyModel extends Model { 
    ... 
    public void onDrawFrame(GL10 gl) { 
    gl.glVertexPointer(0, GL10.GL_FLOAT, 0, mBuffer); 
    gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, 4); 
    } 

} 

我是否應該追蹤世界超級對象中的所有不同的原始模型,並保留內存中所有頂點的副本?然後,我可以在每幀的開始執行一次glVertexPointer調用,並使用DrawArrays的偏移量。

class MyModel extends Model { 

    public MyModel() { 
    // do something clever in parent Model class to track total verts 
    this.offsetId = somethingFromSuper(); 
    } 

    public void onDrawFrame(GL10 gl) { 
    // super's vertices should all have been already sent to GL 
    gl.glDrawArrays(GL10.GL_LINE_LOOP, this.offsetId, 4); 
    } 

} 

回答

1

我不認爲這會產生很大的不同:你仍然在爲每個模型調用單獨的gl繪圖命令。相反,您可能希望由「世界」類來處理圖形,該類將所有模型頂點合併爲一個大數組,並通過一次調用繪製該圖形。除了遍歷模型來獲取頂點信息和構建「世界」數組,而不是在每個模型上調用繪圖之外,它幾乎是相同的。

這種做法是絕對必要的渲染命令繪製小於30點的頂點,根據本文來自高通(有點老了,但可能仍然適用):http://www.cin.ufpe.br/~mact/graduacao/so/dia1/progpc21_dorbie_3dgraphics.pdf

您將無法使用GL_LINE_LOOP在這種情況下,但需要使用GL_LINES。如果您正在繪製三角形,則可以使用插入退化三角形的GL_TRIANGLES或GL_TRIANGLE_STRIP來分離模型。

Cheers,Aert。

+0

啊,我明白了。進一步的分析顯示,glDraw命令與其他任何東西一樣,都是在錘擊時間,所以我會按照你的建議。這是一個非常簡單的'遊戲',所以現在一切都是由低(<10)頂點對象組成的,所以我懷疑你的問題已經解決了。 – Cylindric 2010-09-14 16:01:10

+0

謝謝,我已經開始得到這個工作。它需要一點點工作來改變我的模型使用他們自己的glDrawX,但我到了那裏。 – Cylindric 2010-09-15 15:51:47

相關問題