2012-12-14 50 views
1

我想實現VBOs來提高OpenGL渲染速度,雖然我理解整體概念,但我不確定如何在2D中實現精靈。我發現所有的實現似乎都是繪製一個三維模型,其中所有的頂點都是相互固定的。然而,在2D遊戲中,每個精靈都有自己的位置,因此擁有自己的MVP矩陣。實現VBOs在OpenGL ES中渲染精靈2

如何似乎做:

Basic vertex shader: 
     "uniform mat4 uMVPMatrix; \n" + 

     "attribute vec4 vPosition;" + 
     "attribute vec2 texCoord;" + 
     "varying vec2 vTexCoord;" + 
     "void main() {" + 

     // matrix must be included as part of gl_Position 
     " gl_Position = uMVPMatrix * vPosition;" + 
     " vTexCoord = texCoord;" + 
     "}"; 

Drawing with VBOs (pseudocode) 
    1. Bind vertex/texture buffers 
    2. Load MVP matrix with glUniformMatrix4fv 
    3. Call glDrawArrays/glDrawElements to draw the all the vertices in one call 

有一個簡單的方法來擴展上述方法,以允許改變MVP的?

兩個候選條件的想法:

  1. 加載了頂點到維也納各組織的,而是借鑑每個精靈,裝載如上每個人的MVP矩陣。只保存就是你不必每次都傳入頂點數據,但你仍然需要調用glVertexAttribPointer來索引每個精靈的VBO中的正確位置。我認爲節省的速度會很小。

  2. 不是將MVP矩陣作爲一個統一體,而是將其定義爲一個屬性。將每個精靈的所有MVP連接成一個大數組,並使用glVertexAttribPointer加載它。似乎不可能使用glVertexAttribPointer一次加載一個矩陣(您最多可以加載vec4),所以我將不得不逐列加載4個連續的調用。然後我應該能夠獨立地轉換每個精靈。應該在當前的實施中獲得相當大的速度提升,儘管並置MVP仍然需要時間。

是否有比上述更簡單的實現?我想象一下,像批處理繪製精靈一樣,有一些「標準」的方法來做到這一點。

編輯

我決定去與選項2,但是我有自己動手的問題:Shader attribute mat4 not binding correctly (Opengl ES 2.0 Android)

回答

2

哪些常見的2D引擎在那裏做的是提供一個基於樹的渲染。一個節點有它的模型矩陣,並且有一些孩子受父母模型矩陣和他們自己的矩陣的影響。在運行時訪問每個節點並使其將父級矩陣和自己的矩陣連接成一個矩陣。除非你渲染了數千個節點(精靈),否則你不應該擔心有關將如此多的矩陣傳遞給驅動程序內存的性能問題。

編輯:你也可以有一個特定類型的節點,通常稱爲阿特拉斯,你添加了預先計算的四邊形,只受節點的模型矩陣影響(見https://github.com/cocos2d/cocos2d-iphone/blob/master-v2/cocos2d/CCAtlasNode.mhttps://github.com/TraxNet/ShadingZen/blob/master/library/src/main/java/org/traxnet/shadingzen/core2d/QuadAtlas.java)。

+0

我可能會在賽道上進一步觀察,但是現在我已經決定在上面的帖子中追求選項2,因爲它似乎是我目前所擁有的相當直接的進展。不過,正如解釋的,在編輯後的操作系統中,我遇到了麻煩。 – awr

+0

在這裏發佈一個新問題並留下一個指向其他問題的鏈接會更好。 – Trax