我想實現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的?
兩個候選條件的想法:
加載了頂點到維也納各組織的,而是借鑑每個精靈,裝載如上每個人的MVP矩陣。只保存就是你不必每次都傳入頂點數據,但你仍然需要調用glVertexAttribPointer來索引每個精靈的VBO中的正確位置。我認爲節省的速度會很小。
不是將MVP矩陣作爲一個統一體,而是將其定義爲一個屬性。將每個精靈的所有MVP連接成一個大數組,並使用glVertexAttribPointer加載它。似乎不可能使用glVertexAttribPointer一次加載一個矩陣(您最多可以加載vec4),所以我將不得不逐列加載4個連續的調用。然後我應該能夠獨立地轉換每個精靈。應該在當前的實施中獲得相當大的速度提升,儘管並置MVP仍然需要時間。
是否有比上述更簡單的實現?我想象一下,像批處理繪製精靈一樣,有一些「標準」的方法來做到這一點。
編輯
我決定去與選項2,但是我有自己動手的問題:Shader attribute mat4 not binding correctly (Opengl ES 2.0 Android)
我可能會在賽道上進一步觀察,但是現在我已經決定在上面的帖子中追求選項2,因爲它似乎是我目前所擁有的相當直接的進展。不過,正如解釋的,在編輯後的操作系統中,我遇到了麻煩。 – awr
在這裏發佈一個新問題並留下一個指向其他問題的鏈接會更好。 – Trax