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。
- three.js 文件 - 粒子系統: three.js 實現了一個基於 GL_POINTS 的粒子系統
- 一個徹底現代的粒子系統: 描述了最先進的技術,並設計了一個 GPU 側粒子系統
- WebGL 粒子: 實現上述 GPU 側粒子系統的 WebGL 實驗,管理 260,000 個粒子