citywar 3D Engine v1.5 發佈


更新內容
1. 天氣參數減少一個, 但是結果更正確. 新增被太陽照到的顏色參數.(按F4可顯示對話盒)
2.地形混色的normal map 更多樣化.

3.新增光源, soft particle , anim height fog

citywar_techdemo15.zip(30mb)

https://app.box.com/s/a7iuwaqbx7fsvlkoxa4d

光源

只做點光源而已. 速度比預期的慢.
本來想做影子, 但是試了幾種方法, 速度真是太慢了, shadowmap的方式品質又做不好.
所以只有打光而已.



說明一下:這個2002年的影子怎麼做出來的




2002年時, 在當時的環境做影子 只有一種方法 : Stencil Shadow Volume.

還有一種就是簡單的把物體只能投影到一個全平面的影子而已.

 當時想破了頭,實在是辛苦.

其實原理很簡單, 只是coding能力要很夠.



 
做法就是上面那張圖.原理就是
單純的平面投影 然後做切割.
把 a投影到所有可能的三角形平面上. a', 當然一定會超過,
做切割就可以了.

就是最後就是產生一大串零碎的三角形. 這些三角形就是影子了.
然後把這些零碎三角形 通通劃出來就可.
當然這些零碎三角形會重疊到 就是重劃, 用各stencil buffer紀錄就可.
然後混色就完成了.


 當然樹就先用個事先劃好的樹影, 投影時不只切割三角形 也切割貼圖座標.



3D是屬於技術壟斷的產業

從PS3上的3D遊戲大幅減少就知道 這個發展趨勢.

3D的整個發展, 就是A->B->C->D. 沒有哪個人那麼天才, 可以不經過A,B就會直接跳到C,D的.

更簡單的說 能做出好的3D遊戲的 就是市面上有作品的哪幾家公司.

這些公司早就在3D技術花了10年以上的努力了.

連日本遊戲公司 都跟不上3D技術的發展而淘汰.

GDC一堆發表的文章, 最後一頁 一定就是徵人.

現在3D技術也不是一個人有能力就能做出不錯的產品了.

連id software的 John D. Carmack,也都跟不上3D技術的發展了.

連發表的論文 書籍,甚至都不是一特人能獨自發表新技術, 而是2,3個聯合發表一篇論文.

甚麼都不用講 光是3D卡的硬體廠商, 做多久了, driver 都還一堆問題.

就知道3D技術的挑戰性.


如果你知道3D的最終極目標是甚麼, 就知道3D有多困難.

3D的最終極目標 就是模擬真實世界的畫面, 就知道根本就是不可能的.

有太多限制了, 不只是軟體的演算法而已 硬體gpu運算速度,  記憶體大小, 還有float的精確度.


3D動畫的面大概領先 real time有5年以上. 更別說那些3D動畫 看起來還假假的.

----------
3D技術的發展 有一個新興的勢力, 就是歐洲國家, 都可以做出不錯的 3D遊戲.

其實也不用大驚小怪, 如果你知道  Gauss(高斯是哪一國人),

菲涅耳透鏡(英文:Fresnel lens),是由法國物理學家奧古斯丁.

沒錯 你書本上讀到的那些光學 數學公式 竟然活生生的出現在遊戲裡, 就知道為何歐洲在3D興起的原因了.


 

citywar Engine TechDemo v1.2 發佈

citywar Engine TechDemo v1.2

包含功能:

1.cascade shadow + rain 特效 + 50個人物影子 + culling 速度加快

2.一個編輯 rain特效的介面

3.一個 FPS第一人稱的遊戲方式.


citywar techdemo v1.2 下載(29mb)

https://app.box.com/s/qzqrqmezroja55xbvu94


culling 做了2個加速:

1.1本來是對每個obj做culling, 這數量太大, 全部 464個.

camera cull + cascade  shadow cull *2(層) +water reflect + rain reflect
總共 5*464  次.
後改用 用每一個group做culling 476減少到 171. cpu 少掉 5*(464-171)=1465次運算.
雖然不夠精確 但是速度提升15張.

1.2. shadow culling 本來就有做.但是有些obj總是在影子裡 根本不用算.
 nObjAlways _InShadow, 這有84個obj. 速度也是提升15張.



citywarEngine 1.2 Rain Effect

下禮拜會丟出一個執行檔:demo cascade shadow + rain effect

雨的特效就先這樣了. 能參考的資料太少 又太難寫.

每加一個特效  都要跟原來的整合,整理程式的時間就愈長.

接下來會寫 lighting + cull 這資料就比較多了




如何用簡單的方法解決複雜的問題?

如何用簡單的方法解決複雜的問題?

這不只在程式方面, 很多方面都可以適用.


原則1: 任何的問題都是複雜的問題. (不要認為有簡單的問題)

原則2:任何複雜的問題 都不可能被完美的解決.(該知道到甚麼地步就該適可而已)

原則3:用複雜的方法只會引起更多的問題.

原則4:要花很長時間想出一個簡單的方法解決複雜的問題.(不要太懶了)

很多時候想到的方法 都是複雜的方法, 因為很快就想出來, 結果花大量的時間在 debug,
最後因為方法太過複雜,導致放棄 .


如何用簡單的方法解決複雜的問題?

1.把問題的重點抓出來, 這需要訓練 長時間訓練的結果 才能看出問題的重點.

2.解決重點問題. 代表就解決 80%以上的問題. 其他的細節就可以簡化了.

3.要解決一個複雜的核心問題, 要從各種角度 就是360度 逼近問題.
不要太死腦袋, 一定要怎麼做才可.


廣泛的閱讀 收集資料, 然後逼近核心.

無差別人物影子數

1. 一開始人物影子在 vertex shader計算, 受限於 vertex shader送到pixel shader register數目限制, 只有5個人物影子

2.用cascade shadow後, 人物影子計算改在pixel  shader 計算, 人物影子數提升到10.


3.突然想到 既然場景影子已經是即時產生, 那人物影子也是即時產生, shadowmap可以合併.

不只程式簡化 只處理 cascade shadowmap.

而且 人物影子數目就沒有限制了. 50個人物影子.



citywar Engine:下一階段目標

預計: citywar engine 1.3版功能

1.Casecade  shadow (已做得差不多了, 每增加一層 速度少掉20張. 只做3層而已)
fps總共少掉50張, 換取更好的影子品質, 不大覺得很划算.(在bulr 下去又少掉20張)
所以影子到這裡結束,  最多是做最佳化, 已經花了太多時間了.

2.所以說把影子繼續做好 不如在去寫其他的特效, 少掉50張, 這資源做其他的特效 夠了.
水面特效 只少掉30張.

已確定要做的特效但是不大確定能做出來. 所以無法說明.

3.Cull. 現在發覺, 要增加速度 cull 的效率要提高.


a.人物動態影子 可以從5個提升到10個. 算是意外的收穫.
之前寫在pixel shader, 速度有點慢, 改寫在vertex shader,為了Casecade  shadow,
又改在 pixel shader. 速度沒甚麼掉 算是好事.
寫在pixel shader, 當然人物影子數就可提高了.


b.發覺gpu運算方式 好像是暴力演算法, if的處理速度很慢,for的速度很快.


c.2年前寫引擎時, 我的9600gt  材質只支援到 4096x4096,現在已經到8192x8192
還有在hlsl 裡面寫 break, 速度會狂掉, 現在不會了.

所以說  顯示卡廠商 把driver寫好比較實在, 常常會出現很奇怪的問題.

hlsl 裡面要加強 if continue break 的速度 才是重點.



要更好的劃質, 就要拿硬體規格來換


3D畫面  = GPU速度  +  記憶體   + 程式設計

畫面就是由這三種組成.

現在3D已經沒有 速度又快,  畫質又好,  硬體規格又低的.

軟體的比例已經剩下1/3了.(再加上大家用的演算法都差不多)

事實證明記憶體的比例也愈來愈高了,
例如 id的 RAGE, 可以在很低的硬體配備執行出不錯的畫面, 就是用大量的記憶裡來換的.



citywar 3D Engine Editor 1.0 發布

citywar  3D Engine Editor 1.0 發布

也提供販售完整的程式碼 跟技術轉移   e-mail: houpito@gmail.com

秉持  用簡單的方法解決複雜的問題.    所以這是一個看不到編輯畫面的編輯器

就是一次只能做一件事 的編輯器.

編輯器下載:(38mb)

https://app.box.com/s/c3xpcrlbyi4cvhx9jfml


只需要花個5分鐘   看一下 Editor說明.rtf  說明檔, 沒錯 只要5分鐘 就可完全掌握編輯器的功能了.

有任何問題可以在這裡留言

C++的friend關鍵字實現了軟體工程

很多書本教你的 不要使用 friend,  結果意外的被我發現新方法, 就是大量的使用friend.

因為我不寫繼承的, 所以會有很多class, 之前整理程式碼, 發現閱讀code有些費時,
不知要從哪裡下手.

突然閃過一個念頭, friend 根本是救星.

經過一個多月整理程式碼的心得:

這是程式碼裡的:

class CShadowRole
{
private:
//*** 這裡面有7個變數,  12個函數, 看起來也算蠻大的class ***//

    public:
    CShadowRole()
    {
        m_nRole=0;     for(int i=0; i<MAX_PLAYER; i++)m_szRole[i].pRole=NULL;
    }

    friend class CGame;
    friend void interface_ShadowRole_AddRole( class  CViewFrustum *pCull, class CMyRole *pMyRole, int idModel, BYTE wpn, float time );
};


看到沒有, public 只有一個 初始的, 剩下甚麼都沒有 有兩個 friend.
 
這樣的class幾乎是沒有用的, 但是那兩個 friend 就是重點了,
沒錯,  這個class CShadowRole 只在 class Game裡面使用 跟那個函數裡使用
其他都不能使用.

這樣不是很清楚嗎? 一看到這個class 的宣告 就一目了然 這個 class的使用方法.

所有要存取 CShadowRole必須來這裡宣告firend 才可以使用.
就很容易看出class 彼此之間的關係.

---------------------------------------------------------------------------------------------------------
但是 上面是理想的狀態,  但是 有一個致命的缺點  就是會有一大串的friend,

這就沒有意義了.

-------------------------------------------------------------------------------------------------

所以C++的對於類別成員的封裝 太爛了 只有兩種 private, 跟 public.

應該再增加一個封裝的關鍵字: 也是取名叫做 friend.

宣告為 friend function 跟 friend class, 可以存取宣告 friend 跟public內的函數或是變數.


這樣  friend 真的就會實現 軟體工程的方法.








citywar 編輯器1.0包含功能

主要是4部分:

1.環境光的調整, 光線顏色強度...影子濃度, 可以輕易庭找出任何氣候的參數

2.物件擺放功能: 最主要就是把物體放在場景裡的功能. 還包含可以隨便指定材質.

3.地形畫圖混色的功能, 理論上任何UV座標在[0,1]內的物體 都可以當作畫布直接畫在材質上

4.decal擺放功能, 加強場景的豐富性.


---------------------

時間還夠的話:

5.地形的高低變化只能由 3ds max外部匯入, 無法編輯地形的變化, 感覺也不是很重要.

6.燈光光源編輯, 這重點不是編輯 而是畫面效果, 花的時間比較長.

7.事件編輯, 其實就在場景裡設些屬性而已,  擺放人物 觸發點.....  蠻簡單.

8.其他圖形特效, 這部分時間就很長了.




2013.12月底將丟出一個可編輯遊玩的編輯器

2013.12月底將丟出一個可編輯遊玩的編輯器

簡單的編輯器, 編完之後 可立即以第一人稱角度 在裡面 閒逛. 碰撞 子彈.....

整理程式碼發揮的威力(引擎夜景)

容易調整出 不同的環境光.   引擎1.5版的更新中.....