2016-10-17 233 views
-1

我正在創建基於瓦片的渲染器,其中每個瓦片都有一個頂點模型。但是,從每個頂點模型只有一小部分在一幀中渲染。這些子集改變每一幀。大緩衝區開關與小緩衝區開關的成本

什麼是最快的方式來渲染?我可以考慮以下選項:

  1. 爲每個模型進行一次繪製調用。每個模型都存儲在gpu上。對於每次平局,每次都會切換完整的vbo。然後使用索引爲實際渲染選擇合適的小部分。
  2. 使用一個vbo進行一次繪製調用,通過複製所有其他vbos(必須在vram中複製數據)的必要(小)子集來獲得每幀的組合。
  3. 使用一個vbo進行一次繪製調用,但是vbo是使用glBufferData從CPU數據的每個幀(小)中重新創建的。

你認爲哪個最快,或者你能想到更快的東西?

一個決定因素很明顯,如果在較大的VBO之間切換比在較小的VBO之間切換更昂貴。

+2

只需測量它! – knivil

回答

0

這是一個壞主意做出大量drawcalls。在OpenGL中,你將會受到這種方法的CPU約束,所以最好對很多模型進行批處理。

其實,我會去這個方法。所有靜態幾何都在一個且只有一個VBO和一個VAO內。這並不意味着你只有「一個平局」。但是,您應該使用glMultiDraw * Indirect。 這個想法讓你不得不使用計算着色器在GPU上執行剔除,並在多間接繪製調用中使用類似GL_INDIRECT_PARAMETERS擴展的東西。 Indirect Drawing

對於所有動態幾何圖形,可以使用持久緩衝區。

回答關於更改vao/vbo的問題。改變VAO,或使用glBindVertexBuffer不應該造成很大的開銷。

但是你應該剖析它,它可以取決於你的驅動程序/硬件:)