2009年2月27日 星期五

對SSAO的優化方式和一些感嘆

因為一些原因,所以scene manage暫時不能去動,

其實這一塊還有進步空間。

現在只能以我的部分去試著作一些最佳化。

今天把水底下的任何物件不去作SSAO的運算,

這樣做有好處是:

1.減少pixel的大量運算。
2.在視覺上有正確性的幫助。

第一點的意思比較直覺,因為能夠減少SSAO的運算當然是最好的,

這也是當初用1/2的frame buffer的原因。

第二點要說明一下了,我看過很多的SSAO demo,

就是少了水底下的物件要怎去呈現!

唯一在unreal 3 的demo中,就有看到了。

它還是水底下中有運算到SSAO,但是這作的話,反射的效果會很不明顯。

而且如果沒有反射和折射的效果的話,只是單純的noraml map去抖動,

那水面下會看到SSAO運算到的物件,簡單說:可能會看到黑邊。

所以第二點就是把水底下的物件不去運算SSAO。

其實當我在優化時候,突然想到還有一種優化方式,

不過現在還在實作中,可行性滿高的。

以上的優化方式只是針對GPU的瓶頸去處理的,

CPU的瓶頸還是要去修改scene manage的演算法。

最後,個人一些感嘆:

我看過一些台灣人作出一些高技術的demo,

但是在產品往往看不到此技術。

其實我覺得作出來demo跟商品化還是有一段距離,

尤其是高技術層面的,因為除了還要跟美術去磨合之外,

還有一些問題要去處理,尤其是效能上的。

就好像做出SSAO,但是放上去只剩下幾張fps在動,

我想這根本無法商品化。還有,就是玩家的顯示卡!

這點是很頭痛的,一個game engine,為了考量大量市場,

所以把技術層面降低再降低(聽說仙X Online是這樣?!)。

再掌握高技術同時,也要考慮到底下的人,

如果底下的人想要看此遊戲的完整畫面,只能乖乖去升級,

順便幫Nvidia和AMD賺錢XD。

不過要切記的是,技術愈來愈高並不是單純看高質量的遊戲畫面

它背面還有針對效能上的提升,所以才有高質量的遊戲畫面誕生。

不講GPU和CPU,光是DX9和DX10之間,我就覺得差滿多的。

所以再過幾年,國人還是在遊走DX9的fixed pipeline的同時,

別人早在DX10或DX11的平台下開發了。

2009年2月20日 星期五

我討厭fixed pipeline

這一個禮拜都在搞fixed pipeline。

發現到他的texture blend的operation好少呀~~

雖然lighting方面都是平行光,不過關於light map的混色很麻煩。

如果只是單純混色就好了,也不會花一天的時間去搞。

還有利用fixed pipeline去寫一個project texture,

以上這些動作都是在Effect中。

這一切的一切都是要支援低階卡的關係,

我們的規格會跟WOW一樣,從GeForce 2 MX400開始,

那張卡是支援DX7的,也就是....9年前的顯示卡,

簡單說就是從hardware T&L 一直到 shader model 3.0都有支援到,

不過我們的shader model是從2.0開始,

我們不打算寫shader model 1.0,那種的顯卡是DX8的,

所以還是會用fixed pipeline的方式去作成像的動作。

///////// 09/2/25 ///////////

今天終於拿到ATI Radeon 7000的顯示卡(另稱貧卡或DX7.0卡)。

主要是拿來測試一下我寫的fixed material,

結果發現到!它可以支援用軟體去模擬vertex shader 1.0,

速度上雖然跟一般的fixed pipeline有一點差別,

不過我們的目的不再專攻DX7.0,而是DX8.0的市場,

如果是這樣的話,那我根本不需要有多大的變動,

但是terrain還是有一點頭痛。這等以後再講吧~

在這幾個月還是專注於架構上,沒什麼時間去寫高階的shader。

2009年2月11日 星期三

優化pre-pass和post-pass

昨天把real-time sadow整合完畢之後,試著把SSAO加進去。

在繪製大量物件時(註),發現frame降滿多的,

因為以我的神卡是不可能運算過慢,

所以瓶頸還是出在於CPU上。

其實義大利人對於RenderState Change的優化早就有作了,

讓我剩下的優化方式很簡單:就是所有的物件都是instancing。

作用是大大降低DrawXXXX的driver work,

將顯示卡的威能給顯示出來。

這點在DX10作得很好!所以當初為什麼想丟棄DX9的原因。

在這時間點真的要作一下優化了,因為後面還有其他效果要作,

如:SSAO、PSSM、DOF、dynamic lighting、HDR、motion blur。

這是最基本的,後續要作God Rays...等之類,可以讓玩家自由去選擇。

/////// 09/2/16 ///////////////

終於尋找到效能上的問題!

原來是BOOST_FOREACH的使用方式錯誤Orz。

會導致有7000個物件,白白去作拷貝的動作,

其實我的原意並不是這樣。

以下是修正後:


環境:
雙核心 3.01ghz GPU:ATI 4870
解析度:1440 * 900

ssao off

物件總量 = 7400
polygons =308357
drawcall = 733 (包含instance drawcall 的數量)
instance drawcall =527
fps 30

////////////////////////////

ssao on

物件總量 = 7400
polygons = 681737
drawcall = 1281(包含instance drawcall 的數量)
instance drawcall = 995
fps 20



再來是測試少量的instance object

ssao off

物件總量 = 2837
非instance物件總量 = 1736
instance物件總量 = 1101
polygons = 591182
drawcall = 2056(包含instance drawcall 的數量)
instance drawcall = 197
fps 30

////////////////////////////////////

ssao on

物件總量 = 2837
非instance物件總量 = 1736
instance物件總量 = 1101
polygons = 1076542
drawcall = 2552
instance drawcall = 573
fps 25

//////////////////////////////

註:

在雙核心2.66ghz,nvidia 98000GTX+環境下,

假設同一種mesh和單一diffuse color,

繪製16000個geometry,Polys共有545278,開啟instancing之後,

共呼叫23次的draw call,結果fps是120左右。


不開啟instancing時,會呼叫16023次的draw call,fps降到剩下7。



當然這是最佳狀況,主要是mesh的不同,還會格外增加draw call。

DX10可以突破這個缺點,所以要打國戰之類,是可以做到的,

會這樣講是因為看過ATI的最新DX10.1技術,

只要呼叫一次draw call XD。

2009年2月9日 星期一

real-time shadow整合完畢

由上一篇文章所提到,AGE engine的shadow是用PSSM的演算法,

並且整合到自己寫的script render pipeline。

今天總算給它完成了,因為這幾天雜事很多,

就是春酒的舞蹈的雜事,所以有些時間被佔去。

不過明天還要多測試一些,像是animation instance object和terrain。

下一個backlog就是dynamic lighting整合到自己寫的redner架構。

2009年2月8日 星期日

Screen Space Directional Occlusion (SSDO)

在作SSAO的期間,突然發現到有一個論文讓我感興趣的。

也是關於Dynamic Global Illumination的論文,

算是SSAO的進皆版名叫Screen Space Directional Occlusion 。

其實在我還沒看此文章時,就覺得SSAO所增加空間的立體感之外,

但是就是少納入關於direction lighting的計算。

(有實作過SSAO的人,會發覺到這是post-pass的處理)

在光源射入某一個geometry時,某部分因為是處於半亮的狀態,

但是那部分是處於凹槽的,所以經過SSAO所計算的是全暗的,

在視覺上是一個相當不合理,尤其在配上shadow map的運算之後。

那我也不多講,其實那篇論文我還在看XD。

有興趣者請到這:Tobias Ritschel

論文:Approximating Dynamic Global Illumination in Image Space

這次沒有domo影片,有時間再來作看看。

PS:看DX10過程,被此論文給吸引XD