跳轉到內容

OpenGL 程式設計/粒子系統

來自華夏公益教科書

這是一個正在進行的工作

粒子系統是一種處理大量物件(數千到數百萬)的最佳化方法。

天真的方法是獨立地繪製每個物件(就像我們在大多數其他教程中所做的那樣),但是繪製數千個物件意味著每幀準備和呼叫 DrawArray/DrawElements 數千次,每次都意味著一個 OpenGL 往返,這顯然效率低下。

相反,目標是一次繪製大量類似的物件。

我們確定了兩種主要的渲染粒子系統的方法

  • 在 CPU 上操作屬性並在 GPU 上渲染它們
    • 在啟動時,上傳單個 VBO 的點(帶有 GL_POINTS 的快速精靈),或一組在單個 VBO+EBO 中的所有 3D 物件。
    • 在每幀中,在 CPU 上操作它們,上傳屬性的 VBO。
    • 在每幀中,使用單個 DrawArray/DrawElements 呼叫繪製它們(所有物件使用相同的著色器)。
  • 全 GPU 粒子系統,使用tex1 = fragment_shader(tex2, tex3, ...)模式計算
    • 在啟動時,將所有粒子的初始屬性儲存在紋理中(一個紋素 = 一個粒子的屬性)。
    • 在啟動時,上傳一個巨大的靜態 GL_POINTS 陣列(每個紋素一個)。
    • 在每幀中,渲染一個四邊形到相同大小的新結果紋理,組合片段著色器中的初始屬性並存儲下一個粒子狀態(例如:它的下一個位置)。可以使用多個著色器計算多個屬性。可以交換紋理以將舊狀態更新為新狀態。
    • 在每幀中,繪製靜態的點陣列:在頂點著色器中,在結果紋理(s)中查詢粒子屬性(例如位置)。
    • 無需每幀上傳!
  • 對於非增量變換的特殊中間情況(制服而不是屬性,例如線性運動):如果您在頂點著色器中以程式方式計算位置(沒有屬性操作),則為全 GPU。

參考資料

[編輯 | 編輯原始碼]
華夏公益教科書