2007-03-20

加入Alpha sorting

之前已經把Rendering queue的主架構已經完成. 使用Rendering queue的目的有兩個, 一個是為了Alpha物件的排序, 一個是為了效能最佳化. 作Alpha物件的排序的理由應該是很容易理解的. 畢竟這個從視覺上就可以看出差異了..至於效能最佳化, 簡單的說就是想辦法讓GPU狀態改變的次數減少, 使得GPU的效能可以發揮極致.

不過目前只加上Alpha物件的排序. 為了Alpha物件的排序, 使用了兩個queue, 一個是放不透明物件, 另一個是放半透明物件. 可是怎麼判物件是否是半透明呢? 由於在寫HLSL程式碼就會寫上RenderState 的設定, 所以只要有辦法在載入HLSL程式時候, 把設定的RenderState數值抓出來就可以了. 方法就是實作一個衍生自ID3DXEffectStateManager的類別(參考DX9 SDK的StateManager 範例). 透過新的StateManager, 在呼叫ID3DXEffect::BeginPass(..)時, 就可以知道這個pass有設定到哪些renderstate了..

目前的render queue裡面放的是單一物件單一Effect的command. 不過今天測試到3DSMAX提供的Glow.fx 裡面有兩個pass, 一個pass沒有alpha blending, 一個pass要alpha blending. 目前我會把這樣的shader都當作alpha物件. 我在想之後也許需要把rendering queue的command改成單一物件單一pass的command.

0 意見: