切換
舊版
前往
大廳
主題

Instanced rendering

Lumi | 2014-09-26 02:05:57 | 巴幣 0 | 人氣 423


▲複製人大軍

Instanced rendering可以只用一個draw call畫出任意數量的物體,此功能早在OpenGL 3.1版就已經被支援。之所以一直沒有實作這技術,主要是想不出物體的位置等資訊該放在哪裡比較好。如果放在uniform buffer裡,物體的最高數量就會固定住。而如果照Programmable Vertex Pulling所建議的放在vertex attribute裡,我就得跟討厭的VBO打交道,而且想到修改code的困難度就讓我打退堂鼓。不過今年三月各大廠所提出的Approaching Zero Driver Overhead(AZDO),搭配OpenGL4.3新增的shader storage buffer,終於讓我找到一個相對比較簡單的實作方式。不但可以把上傳資料的動作從render thread移走,還能順便改進我原先的程式架構。

另一個讓我決定動工的因素是下一代OpenGL的宣布,據說OpenGL會整個砍掉重練。我猜到時候可能會沒有向下相容,轉換過程大概會非常痛苦。不過新API很有可能會擁有AZDO提到的功能,考慮到現在先把程式轉換成AZDO的方式,屆時轉換成新一代OpenGL說不定可以稍微輕鬆點。順帶一提AMD將Mantle API提供給Khronos用作下一代OpenGL的參考,新OpenGL如果使用了Mantle架構,AMD也不收授權費用。往好方面想AMD將來有可能可以大量使用Mantle的程式碼,擺脫老OpenGL driver那充滿bug的code base 。但另一方面新OpenGL誕生後,我們還會需要Mantle嗎?

Instanced rendering實作完以後效能讓人失望,測試用的場景(非米卡莎)雖然draw call變少了,但fps幾乎降了一半左右,推測可能是有太多資料需要同步了。原本是替場景中每個非重複的物件配置buffer,每塊buffer都各自處理同步。後來改成所有物件都共用一塊大buffer,每個frame只同步一次。測試用場景的fps這才回復成原本的程度,不過用我的GTX 460畫一百個米卡莎,fps還是只有接近30左右。Radeon HD 6630M則是編譯shader時就失敗了…。

追加:R9 380仍然得到相同錯誤。

創作回應

更多創作