2009年3月5日 星期四

關於dynamic lighting

前幾天看到C9的宣傳影片,發覺到dynamic lighting有明顯進步。

第一次公布宣傳影片時,只有人物和怪物有dynamic lighting。

最新的宣傳影片,多加上Terrain的dynamic lighting運算,但是草則沒有。

草為什麼沒有?這我能瞭解此原因。要作出來是可以,只是效率上的關係。

我這幾天在看一些資料,關於dynamic lighting的作法有幾種:

1.Single Pass PerLight
2.Multiple Lights PerPass
3.deferred shading

第一點的優點是彈性很大,可以隨意去加你想要的light type。

但是效率會不太好,因為batch會提升的關係。

第二個跟第一點是相反的關係。

第三個我就不談了,光是Geometry Buffer就讓人吃不消了。

第一點在製作console game的話,可以拿去實作,

但是在online game的話,我會去用第二點。

其實在C9的dynamic lighting只有Point light而已(影片中),

至於每個geometry能吃多少個光,這我就不清楚了,

能確定的是online game是不能處理太多光源的,原因在於效能。

現在還沒完成,要等到下禮拜一才開始動工,

不過大致上看了一下之後,要實作出來是沒什麼問題,

而且關於玩家的顯卡上的運算方式和光源數量的調整動作,

也是沒有多大的問題。


//////////// 09/03/11 ////////////////


花了兩個工作天,已經把dynamic lighting給完成了,

每個geometry可以吃5個燈光(per-pixel in shader 2.0),

加上direction light就有六個燈光,至於比較遠的話,會弄成per-vertex。

基於效能的關係,花草不會納入運算,不過樹木會納入。

其實最後會加上bloom效果,會讓人看起來花草有納入運算。

課長講說:試看看能不能吃更多的光。

我想說...就算可以吃很多,但是還沒測過整體效能,

所以吃太多也未必好事。

而且這東西會跟C9一樣,會跟特效放在一起。

2009年3月1日 星期日

智冠春酒晚宴

真是難忘的一個晚上。

昨晚是公司的春酒晚宴,當天有六組團體在表演,

競爭相當激烈!在滿分只有50分之下,

每個團體的分數只有48、49、 50分三種,而我們這組拿下第一名!

而且我們又是第一組表演,所以我們對每一組的表演相當緊張,

因為他們表演的內容也相當好。

而我們主要表演內容是男性的「應援團」,還有女性的「啦啦隊」。

團長(最右邊)和組員:


這兩個是團長:



我後面有小腰包,所以屁股有點翹XD



PanPan(團長)超high低:



大團照:中間那位也是程式課的組員



抓到外星人XD:



我們的星光大道入場:




第一場個人演唱的準備:中間是我們的主角!




我們在一開始的個人歌唱表演時,就當同組的舞伴,

所以那時候已經打下團體第一名的根基!

我在當舞伴時,緊張到在跳舞過程中,腳差一點抽筋XD。

那位歌手當然很快就拿到10個燈,也就是滿燈。

跳完之後,還有人找我們去拍照,真是讓我嚇一跳XD。

重點來到團體表演時刻,沒想到團長一開始站的位置錯誤,

還加上搶拍@@! 還好這都不影響成績,而且可能還會有加分動作,

因為那位團長相當有Fu XD。

我們跳的過程比練習更加有魄力!整個應援團的氣勢有帶出來。

在最後,兩位團長的合體技出了點差錯,不過這都是加分動作XD。

因為我們只是春酒表演,不是比賽表演,只要氣氛帶出來就行了。

在最後的頒獎典禮,我以為是王總會上台頒獎,

沒想到是高雄縣縣長楊秋興@@,我超high低!



但是如果是高雄市市長的話,那更好!

因為我們團長跟市長是一樣的髮型XD

在抽獎方面,我們六位應援團當中有四位抽到獎品,

分別有PSP、ipod、五千塊禮券、股票。我就是抽到股票的人!

當時我超high的XD

我們應援團共六人,其中五人是程式開發課,一人是動畫媒體部,

我們團隊不像一般程式人員很害羞的阿宅,我們是很「悶燒」的阿宅。

最後!自樂應援堂!加油加油加油~

PS:其他照片會放在我的無名上。

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