2011-09-08 67 views
3

我正在嘗試爲使用OpenGL ES 2.0的Android應用程序創建一個非常簡單的粒子系統。基本上它只是用於背景中的線性移動雲。在開始之前,我的第一個想法是與點精靈一起工作,這就是我一直在嘗試做的事情。這對我來說很難做到,但除了這些問題之外,精靈們真的需要這樣做嗎?OpenGL ES 2.0 - 簡單粒子系統的最佳路線

在我的搜索中,我已經閱讀了很多相互矛盾的內容來解決我的錯誤,並且我不想投入大量時間使它在一切正常的情況下運行,如果這不是我應該的解決方案首先要去做。人們會發布諸如裁剪之類的各種麻煩,甚至與使用三角形相比,性能下降。我希望有經驗的用戶能夠洞察點精靈適合什麼位置以及何時應該使用它們,包括像我的情況,他們最多隻能在屏幕上顯示幾十個「粒子」。

回答

4

請記住,點精靈有硬尺寸限制,而且尺寸越大,性能越慢。如果你的目標是隻有12個「粒子」,我認爲你應該把它們作爲四邊形。另一方面,如果你的目標是讓12個雲由許多許多「雲粒子」組成,每個雲粒子都會給它們帶來生氣蓬勃的效果,那麼是的,你應該選擇點精靈。

瓶頸將是填充率,尤其是因爲您可能會使用混合。

如果你有100多個雲,是否使用點精靈的問題變得更相關。要爲它們設置動畫,您必須發送一個新的緩衝區來打開每個幀(方法1),或者使用不同的變換矩陣(方法2)分別調用每個雲。後者很可能是最慢的,但前者要求每個雲發送4個新頂點(假設索引渲染),而如果使用點精靈(方法3),則每個雲只有1個新頂點。

在這一點上,很容易粗略地計算出什麼是最快的。方法2意味着16*4*num_clouds字節的數據傳輸到GPU每幀,方法1是d*4*num_clouds,而方法3 d*num_clouds,其中d是2或3取決於你是否需要z。值得注意的是,方法1和3一次發送數據,而方法2一次發送16 * 4個字節。

由於您使用的是GL ES 2,您可以跳過方法2中的矩陣並僅將翻譯作爲向量發送,但您仍然會遭受非批量數據傳輸和每個實例設置統一的成本。

編輯: 實際上,在許多粒子的情況下你會做的是設置一個統一的時間,並且將雲的速度作爲靜態屬性,然後通過將速度乘以時間,並確保它們在必要時包裹邊緣。因此,您只需要爲每個幀傳輸4個字節即可完成動畫雲場景。

+0

好像點精靈仍然是我的方式,所以我想我會戰士,並試圖讓他們工作。非常感謝那些有用的信息。然而,我還有一個與他們有關的問題。我讀過某些設備根本不顯示它們,我想知道這是舊版Android手機的問題(使用OpenGL ES 1.1時),而不是像我的應用將運行的更新式的手機。 – Shamrock