Home > 遊戲編程 > 圖像編程

圖像編程 Archive

Freetype2向量文字渲染

上回使用Freetype2的光柵化(Rasterization)功能把文字渲染到 Texture上,再把 Texture 渲染到螢幕上。除了這個方法外,前文也提及可以把字型以向量方式渲染。在朋友的慫恿下,加上未有這方面的經驗,便花了兩三天去實作這個功能。雖然這個功能在遊戲中完全不重要,但實作這個的難度比預期高,也沒找到類似的參考,而且需要用許多計算幾何(Computational Geometry) 的演算法,對我來說,好像是一個學習和練習的功課。我嘗試把實作的過程記錄下來,和大家交流。

Continue reading

Freetype2 文字渲染

Freetype2 是一個開源的文字渲染程序庫,支持多種向量和點陣字型格式。以前的項目用過這程序庫,不過不是我親手整合。以前的項目有很多不同的重載函數去提供各樣文字渲染功能。今個星期花了三天整合,花了不少時間想,怎麼可以最有彈性、又最簡單呢?

Continue reading

開始實作引擎的基本類別

話說之前想做 Collada 滙入,便最基本要有一個內部存放 Collada 滙入後的資料。這個「雙休日」(內地常用語) 就留在家中乖乖寫程式……寫不出的時候也看了十幾集動畫。

架構上參考了之前看過的 Unity,採用 Component 型式。目前實現的幾個類別的關係如下圖:

採用 Component 架構的一個好處是,減少了傳統 Scene Graph 的類別繼承和節點 (node) 數目。一個實體 (entity, 有些引擎稱為 Game Object) 可以有 Mesh 元件,也可以同時加入腳本、碰撞物件等元件。

實作過程中出現許多問題,和大家 (及將來的自己) 分享一下。

Continue reading

希望在家繼續做遊戲,首先還是做 COLLADA 吧

說點近況。自從四月回港參加好友的婚禮,帶了台 Xbox360 回上海後,便花了許多時間「研究」遊戲,包括我公司的幾個作品,之後也「研究」Wii 的各種遊戲。家人回港後獨自一人,還看了蠻多的動畫和最近的奧運。之前在家中做的項目便擱置了將近半年……雖然也不是完全沉醉於「研究遊戲」和其他娛樂上,書和文獻也有看一些,但還是覺得生活應該得更充實一點。這幾天又再想繼續之前的項目。

第一件發現的是,我的記憶能力真的很有限。過了五個月,幾乎完全忘記了之前的想法、進度等等。全靠閱讀這個 Blog 才知道五個月前的 Milo 在想甚麼。「外置記憶體」真是很重要,而且可以用來認識過去的自己。不知道還能否找到十年前在網上發表的日記,看看當時頗年少氣盛的自己。

讓 COLLADA 作為新起點

之前的項目主要做了非常基楚的混合語言、跨平台圖像及工具的嘗試。本來想繼續做一點輸入及物理,以完成整個遊戲循環,做到一點互動的機制。但是,對比較喜歡電腦圖像編程的我來說,始終敵不過引誘,想載入一些比較好看的3D模型,並且做一些實驗。因此,暫時想先做載入3D模型的部份。

要載入3D模型,COLLADA 似乎是最好的選擇。COLLADA 是一個公開的三維數據 XML 交換格式。目前許多三維圖像軟件(如 3D Studio Max、Maya、SoftImage 等等)都有滙入滙出 COLLADA 的功能 (原生支持或透過插件),可以省下自行編寫插件的時間。

要在程式中支持讀寫 COLLADA 格式,最簡單的方法是使用 COLLADA 的程式庫。流行的程式庫有兩個: Feeling Software 的 FCollada 和Sony Entertainment 的 Collada DOM。兩個皆為 C++ 開源項目,並且皆使用 Document Object Model (DOM) 的方式存取 COLLADA 資料。

FCollada 的優點在於 API 比較簡單、可同時讀寫不同版本的 COLLADA 格式。而且,現時流行的 ColladaMax 和 ColladaMaya 插件都是 Feeling Software 採用 FCollada 編寫的,兼容性可能比較好。可是,一個壞消息是,Feeling Software 已於本年3月停止 FCollada 的更新,現在由一個開源隊伍維持該項目

Collada DOM 是 Sony Entertainment 的產物 (事實上 COLLADA 也是由 Sony 發起的標準)。Collada DOM 的一個特別之處是,DOM 的 API 是由 COLLADA 的 Schema 用程式生成的。這樣的好處是,COLLADA 格式的版本更新只需要運行程式就能得到新的 API。不過這是雙面刃,Collada DOM 的缺點之一就是不能同時讀寫不同版本的 COLLADA 檔案。

經過一番比較後,現時選擇了 Collada DOM。它的一些吸引之處包括:

  1. 可選擇 XML 解析器
  2. 直接支持 Windows、Linux、OSX 和 PS3
  3. 包含一個 Collada RT 的開源項目,內有一個基於 OpenGL 的 COLLADA 檔案檢視器

最後一點最吸引我。這個檢視器除了支持基本的 geometry ,還支持 Skin、Skeleton、Animation、Collada FX 等等。這是一個很有參考價值的例子,我可以跟據這個例子去使用 Collada DOM。相對地,FCollada 並沒有這樣全面的開源例子。

昨晚編譯了 Collada DOM ,也測試了 Collada RT 檢視器和看了一些文檔。但是,要轉換 Collada 格式去引擎內部格式的話,目前的引擎尚欠一個層階式的物件系統。因此,還是要先設計遊戲物件的系統。

P.S. 曾經想過,半年都沒寫到甚麼出來,而科技一日千里,一個人在家裡做這樣的事情有意義嗎?時間雖然是一個問題,但我公司的一個引擎也有七、八年的歷史。如果可以做一個健全的架構,是應該可以與時並進的。一個不能敏捷地修改及更新的項目,很快就會結束它的生命。作為一個學習和分享經驗的平台,這就更沒所謂了。

P.P.S. 我中秋節便會回港陪產,黃金周後才回上海。屆時心理和生活也許又會作出很大的改變。

完成 Win32上的OpenGL/Cg

星期六日都坐在家中做 OpenGL/Cg 的移植,比想像中遇到更多問題,但終於在三月最後一個晚上完成。這裡做一個簡單的回顧,希望大家遇到類似的問題時可以減少脫髮。

編譯期選擇圖像 API

之前曾經寫過一篇《跨平台的圖像渲染引擎》,提及使用 abstract factory pattern 或 conditional compilation (macro) 來為圖像 API 抽像化。後者的優點是效能較高 (不需使用 virtual function call),但缺點是代碼難看。為了改善後者的缺點,我想到了使用 inheritance 去避免在 class 的定義裡寫 macros。舉一個例子就會明白。

首先,利用 #include 後可以是一個 macro 的功能 (Visual C++ 裡只可以是一個 macro identifier,而 gcc 可以 expand macro),把平台相關的 header 和 implementation 檔放在同一個地方:

Continue reading

實時 Radiosity 系統 Enlighten

今天才第一次看到 Geomerics 的 Enlighten 新示範短片(在 GDC2008 發佈),感覺很震撼。雖然在 Radiosity 技術方面和他們一年前的 Tech Demo 的分別可能不大,但結合了 HDR、SSAO 等技術、展示了一些使用者介面即時調效多個光源的設定、人物受到間接光源的效果等等,做出來的整體效果完全不一樣。而且,它說明這技術已實際在 PS3 和 Xbox360 上應用 (雖然沒有影片為證),即是它是可以應用在現今的硬件之上,而不是一些只可期待而不能用的技術。

網站裡介紹了 Enlighten 的工作模式:

  1. 場境需要作一些 pre-processing,但只需要 gemoetry 資料,而不需要 texture、material、lighting 等資料。這和 Precomputed Radiance Transfer (PRT) 的需求一樣。
  2. 使用者的引擎要把場境的 Local Illumination 渲染至 texture space ,交由 Enlighten 計算 Radiosity。
  3. 結合 Radiosity 和 Local Illumination。

使用這種工作模式對美工特別有幫助,因為美工可以即時微調光照效果,而不需使用 Global Illumination 的 Renderer 去花幾十分鐘甚至幾小時去渲染一些只是靜態的 Light Map。我相信除了遊戲之外,電腦動畫及電影特效都應該可以應用這種技術。

要追技術感覺是越來越難。不過我要提醒自己,不要只追求個別的技術,現時需要的應該是做整個遊戲的經驗,gameplay 和相關的工具是我最弱的。

其他類似的技術:

Lua 的渲染測試

今日順利完成3月6日訂下的第二個目標,把昨天的 C# 測試程式用 C++ 及 Lua 實現。圖像輸出和昨天的測試程式一模一樣,就不上傳了。

C++ 負責創建視窗和呼叫 Device::Open(Hwnd),Lua 做渲染的部份。(其實在遊戲中是不會用 Lua 做這麼低階的工作,這裡只是當作測試 Lua Binding。)

除了編寫 Lua 的 SWIG interface 檔案外,今天主要的工作是考慮如何從 C++ 呼叫 Lua 的類別。發覺對 Lua 的語法還是很不熟識。

有興趣的話可以比較以下的C++/Lua代碼和昨天的C#代碼

Continue reading

實作簡單的材質

進度有點緩慢,今天才完成了 3月6日定下的第一個目標。

使用 blinn_bump_reflect.fx 的渲染

今天的學習進度:

  1. 設定 Matrices 及修正相關函式: 現時設定為 column-major。改正相關函式花了很多時間。
  2. 修改 ChamferBox: 由於 ChamferBox 只負責生成一個 Geometry 物件,所以把 constructor 改為一個 function。原本想嘗試做一個 non-member function,但是 SWIG 部份有問題,花了一兩個小時也找不到解決辦法,所以現在改為一個 static member function。
  3. 實作 Material: 使用 HLSL fx 檔案在建構一個 Material (在 Direct3D9 上而已,之後再考慮跨平台的設計)。利用 FX Composer 的 Blinn.fx 測試渲染。
  4. 加入 Texture: 因為 blinn.fx 需要 diffuse texture,又實作了一個 Texture 類別,和 Material 相似,也是從 constructor 讀入一個影像檔案。
  5. 測試 blinn_bump_reflect.fx: 因為這個 Effect 需要 Tangent 和 Binormal,所以實作了
    void GeometryBuilder::ComputeTangentSpace(int texcoordIndex)

    函式從三角形網格計算這些向量,當中參考了這個網站的實作

  6. 加入 CubeTexture: blinn_bump_reflect.fx 需要環境貼圖,因此加入這個類別。並重構 Texture,使 Texture 和 CubeTexture 繼函自 TextureBase。

Continue reading

實作Geometry Builder

geometrybuilder1.png

因為還未決定坐標系統,今天先實作 Geometry Builder。

首先闡述現時的設計:

  • Geometry 類別是一個渲染的單位,儲存平台相關的渲染資訊,例如在 Direct3D9 版本裡包括了 Vertex Declaration、Vertex Buffer(s)、Index Buffer 和 Draw-call 的參數。但它並不包含 World Transform、Lighting 及 Material 等資訊。
  • GeometryBuilder 是用來生成 Geometry 的輔助類別。Geometry Builder 的介面是一個平台無關的,只有 Build() 函式的實現才跟平台相關, Build()是把建立的平台無間資訊轉化為平台有關的 Geometry 內容。
  • Device 類別有一個 DrawGeometry() 函式用來渲染 Geometry 物件。

Continue reading

繼續圖像引擎

因為太太星期五抵上海,自那天到星期日也沒有「開工」。

今天繼續做圖像引擎,不過只有小許時間。現在加了一些 hard-code 的 D3D Matrices,可以從 C# 渲染一個 Chamfer Box (no lighting)。

想繼續下去時又停了下來,為了想幾件事情。一開始是考慮用甚麼的 handedness 的座標系統和 column/row major 的矩陣,不過找不到一個比較通用的標準。後來就想以一般的 shader 例子作為主要考慮,所以往 Nvidia 下載 Fx Composer 2,希望可以使用其設定的慣例和例子。剛開始可以直接用 HLSL 的,之後再考慮 CgFX 或 COLLADA FX。歡迎各位討論,特別是用過這些工具的朋友。

接下來設定好這些慣例後,就會加入一個簡單的預設 shader,再 refactor 現在的 Geometry 生成方法。現時的想法是,建立一個 Platform-specific 的 Geometry Class,它基本是一個 draw-call 的資訊。再設計一個 Geometry Builder,方便 procedurally 建立 geometry。這個 Geometry Builder 的介面應該是平台無關,日後可以利用這個介面來做個別平台的三維模型轉換 (e.g. COLLADA 到 Geometry 的轉換)。希望透過這個介面,可以在 Lua 簡單地寫一些 procedural geometry,例如 Chamfer Box、Teapot 等等。這些其實在遊戲中不太實用,但作為 script 和 CG 的學習可能不錯。

今天,也要早些睡了……

Home > 遊戲編程 > 圖像編程

Search
Feeds
Meta

Return to page top