▲複製人大軍
Instanced rendering可以只用一個draw call畫出任意數(shù)量的物體,此功能早在OpenGL 3.1版就已經(jīng)被支援。之所以一直沒有實作這技術(shù),主要是想不出物體的位置等資訊該放在哪裡比較好。如果放在uniform buffer裡,物體的最高數(shù)量就會固定住。而如果照Programmable Vertex Pulling所建議的放在vertex attribute裡,我就得跟討厭的VBO打交道,而且想到修改code的困難度就讓我打退堂鼓。不過今年三月各大廠所提出的Approaching Zero Driver Overhead(AZDO),搭配OpenGL4.3新增的shader storage buffer,終於讓我找到一個相對比較簡單的實作方式。不但可以把上傳資料的動作從render thread移走,還能順便改進我原先的程式架構(gòu)。
另一個讓我決定動工的因素是下一代OpenGL的宣布,據(jù)說OpenGL會整個砍掉重練。我猜到時候可能會沒有向下相容,轉(zhuǎn)換過程大概會非常痛苦。不過新API很有可能會擁有AZDO提到的功能,考慮到現(xiàn)在先把程式轉(zhuǎn)換成AZDO的方式,屆時轉(zhuǎn)換成新一代OpenGL說不定可以稍微輕鬆點。順帶一提AMD將Mantle API提供給Khronos用作下一代OpenGL的參考,新OpenGL如果使用了Mantle架構(gòu),AMD也不收授權(quán)費用。往好方面想AMD將來有可能可以大量使用Mantle的程式碼,擺脫老OpenGL driver那充滿bug的code base 。但另一方面新OpenGL誕生後,我們還會需要Mantle嗎?
追加:R9 380仍然得到相同錯誤。