顯示具有 Game Engine 標籤的文章。 顯示所有文章
顯示具有 Game Engine 標籤的文章。 顯示所有文章

2017年12月17日 星期日

有趣的 OGRE 2.1 旅程

因為工作緣故
有機會接觸 OGRE 這個老骨董
(其實本來想專心玩 Unity)

不過花了點時間看了 OGRE的新發展後
發現他們也是很有野心的
目前的開發方向都很有趣

簡單幾句話帶過 OGRE 2.1 的特色的話呢...
就是
1. 偋棄 object-oriented 邁向 data-oriented driven設計方向的懷抱
2. Performance, performance, peroformance...then still performance!
3. 很多改動都因為效能考量整個重構, 像不再支援許多 listener, 因為他們認為 visitor design pattern is SLOWWWWWwww!
4. Cache-friendly & threading 至上主義
5. OGRE 2.1 效能表現海放 Unity & Unreal (他們自己說的 XDDD)

順便附上之前在研究時順便整理的幾篇投影片
因為工作的關係
玩 OGRE的時光暫時告一段落了
不過 v2.1真的很有趣
期待我未來有空時回去補上一些好玩的體驗 (LoD + animation + AAA graphics...)





2017年5月26日 星期五

舊editor開發工作




記得去年年初(2016) 時就有被付予要做遊戲引擎的編輯器更新(升級)的任務
但我想去年我已開始消沉了吧
所以這方面的進度一直都很慢
直到年中時才有初步架構出來
到了下半年 prototype 逐漸自己一行一行刻出來了
然後做出這樣另一個難用的鬼東西 XD
(都是托 irrlicht 的福)

好啦要不是 irrlicht,這鬼東西就刻不出來啦!

是的,我開始有這種想法。
也因此,在年底時,又經過一兩個月的思考之後。
我下定決心一定要改用 Unity 或 Unreal (其實還考慮過Lumberyard啦)!

因此從 2016/10之後開始重新回去自學 Unity。
選擇 Unity 除了因為公司美術部門本來就是配合 Unity 之外,
也因為學習資源最多最方便。
並在2017年初強迫介入部門開發決策,把開發工具整個導向 Unity。

然後,我就跳船了 XDDDDD

影片中是當時試作的 lava shader (for mobile version, in GLSL) 的 DEMO。
shader code 參考以下佛心 post:
http://irrnetcp.proboards.com/thread/2/lava-shader-hlsl

2017年3月28日 星期二

Unity 筆記

前陣子大概花了3個多月的時間,
把官方說明網站的內容看了個大半,
因為有與同事間分享的關係,
有一部份有整理成筆記,

現在放到 slideshare,
也當留個紀念吧(?

我自己有整理的部份主要是針對 Animation, Physics, Navigation 這3個章節,
其他的不是不夠熟, 不懂, 不然就是沒時間(Graphics),
其中 Graphics 內容實在太多了,
直到現在我才想起來我跟本跳過這一節了 XD

這次先分享已上傳的部份,
Graphics 雖然是我最熟的,
但要不要整理的話.....看未來緣份吧


Working in Unity



Animation

2017年3月13日 星期一

Shader Forge環境設定



最近因為公司同仁需求,所以看了一下Shader Forge環境。
這個超強大的 node based shader editing tool 真的是佛心來的。
讓一般開發者不用具備 shader programming 背景知識也能做到 AAA層級效果的 shader。

不過因為也很難找到詳細的官方說明文件,
所以我就花時間自己補充了一下,
文件已上傳到我的 slideshare,
詳細內容我這裡再列出一份,
大家可以參考一下,
如果我有寫錯也可以指正一下,順便幫我勘誤 XD

1. Shader Settings
-         Path: 對應Shader選單的名字路徑。
-         FallBack: 預設取代shader。由Pick按鈕選取。
-         LOD: Level of details設定,當物件佔螢幕面積超過設定數字(200)允許使用此shader
-         Allow using atlased sprites: 允許使用合成大圖(packed atlas)
-         Draw call batching: 是否允許batching
-         Inspector preview mode: Material inspector檢視的預覽物體類型。
-         Target renderers: shader指定支援的硬體環境對象。
n   Direct3D 9: windows DirectX環境。
n   Direct3D 11: windows DirectX硬體環境,在windows環境使用Unity Editor編輯時Direct3D 9Direct3D 11要選取才會正常顯示,不支援PC game環境時,最終版本shader不需要選取Direct3D 9Direct3D 11
n   OpenGL Core: 泛指OpenGL 1.x/2.x/3.x/4.x環境。沒有支援PC game環境時最終版本shader不需要選取OpenGL Core
n   OpenGL ES 2.0: 移動裝置環境,OpenGL ES2版本。
n   OpenGL ES 3.0: 移動裝置環境,OpenGL ES3版本。
n   iOS Metal: 移動裝置環境,新的iOS繪圖環境(建議選取支援)
n   Direct3D 11 for Windows RT/Phone: Windows Phone(移動裝置版本)支援的Direct3D 11環境。
n   Xbox One | PlayStation 4 | PlayStation Vita: 各類家用主機情況。
               Nintendo 3DS | Nintendo Wii U: 任天堂裝置的支援。

3. Lighting
-         Render Path: Unity光照繪圖流程方案(LightMode)Forward(預設,傳統直接進行繪圖流程))Deferred(分離式繪圖流程)
n   Forward模式下可設定Light CountSingle Directional(預設)只允許單一方向光;Multi-light允許場中多個光源(注意每多一個光源會多跑一次ForwardAdd pass)
-         LightMode: 已支援的打光方案。Unlit/Custom(未打光)Blinn-Phone ; Phone ; PBL(Physically Based Lighting)
n   (PBL) Specular Mode分為SpecularMetallic兩種反光方案實作。
-         Gloss Mode: Gloss(光澤感)Roughness(粗糙感)
n   Remap gloss from [0-1] to [1-2048]: 更精確地gloss彩度分布計算,效能代價較高。
-         Transparency Mode: 透明打光實作方案。Fade(傳統漸透明效果)Reflective(保持有真實反光表現)
-         Energy Consering: 數入與輸出結果的光能量是否守恆(PBL很重要)
-         Lightmap & light probes: 允許支援Unity5內建的global illumination光照方案。
-         Per-pixel light probe sampling: Light probe環景光照偵測計算是否允許在per-pixel階段。
-         Reflection probe support: 是否支援即時反光光照計算。
-         Receive Ambient Light: 是否能接收基本模糊光源顏色。

-         Mask directional light specular by shadows: 由方向光產生的影子資訊來當作反光(specular)之遮罩資訊

4. Geometry
-         Face Culling: 排除正面或背面或雙面繪圖選項。
-         Normal Quality: Interpolated(直接使用內插結果,較省效能但較不準)Normalized(精確計算)
-         Vertex Positioning: 頂點位置座標計算模式。World space(一般幾何頂點)Clip space(螢幕空間頂點,應用在全螢幕後處理時)Billboard(視為面向鏡頭的Billboard對象)
-         Normal space: 實做normal mapping(bump mapping)時,normal計算要採用哪種空間。Tangent(幾何表面空間)Object(物體空間)World(世界空間)
-         Vertex offset mode: 頂點位移方式。Relative(相對偏移)Absolute(頂點座標直接被新的輸入值取代)
-         Tessellation Mode: 三角形tessellate方法。分為RegularEdge length based
-         Outline Extrude Direction: 邊緣幾何突出方向選擇。有From origin(由原點向頂點座標分量展開)Vertex normals(延著頂點法向量延伸)Vertex colors(由頂點顏色決定偏移量)
-         Per-pixel screen coordinates: 是否在每個pixel上計算螢幕對應座標。
-      Show 2D sprite pixel snap option in material: 精確計算2D sprite對應螢幕座標,實現精準的sprite based game繪圖結果。

5. Blending
-         Blend Mode: 透明混合方式。Opaque(不透明)Alpha Blended(透明,由alpha決定不透明度)Alpha Blended Premultipied(透明,自身RGBA不變累加上去)Additive(透明,新舊顏色RGBA相加)Screen(透明,舊顏色依新顏色比例衰減)Multiplicative(透明;新顏色與舊顏色相乘做合成)
n   透明混合公式係數: Source(fragment shader產生顏色)Destination(目標frame buffer已存在顏色)
-         Color Mask: shader寫入color buffer時的顏色通道mask
-         Dithered alpha clip: 使用Opacity Clip功能時,可支援的dithered alpha clip matrix(2x23x34x4)
-         Offset Factor, Offset Units: Polygon offset偏移設定。
-         Per-object refraction/scene color(expensive): 每個物件使用此shader時都重新更新refractive texture內容(截取當前螢幕),效能代價很高。
n   Texture name/group: 共用的refractive texture名字。
-         Receive Fog: 是否支援Fog運算。
-         Auto Sort: 自動設定rendering sort相關參數。
n   Order: Shader tagQueue設定值。
n   Render Type: Shader tagRenderType設定值。
n   Depth Test: Depth buffer的深度值比較規則。
n   Ignore Projectors: 是否呼略projector運算效果。
n   Write to Depth buffer: shader的深度結果是否要寫入depth buffer
-         Stencil Buffer: shader是否進行stencil buffer操作。
n   可設定Reference ValueComparison比較規則,Masks for Read MaskWrite Mask
-      Pass(stencil buffer pass情空下的動作)Fail(stencil buffer fail to pass情況下的動作)Fail Z(depth buffer fail to pass情況下的動作)

6. Experimental
-         Force Shader Model 2.0: 強迫此shader支援shader model 2(#pragma target 2.0)
-         Force no custom shadow pass: 關閉自動產生的shadow pass
-         Force no fallback: 強迫在shader中不設定fallback shader

2017年2月17日 星期五

夢遊

一直很想做個可以媲美 AAA 等級的大作,
但在台灣好像沒有人在思考這個方向,
就算近年最成功的雷亞等公司目前也還是專注在 mobile 為主.

但就像前幾年大宇的製作人隨口嘴一下後來被笑一樣,
當初他們很豪氣的說如果給他200人幾千萬,
他也可以完成台版的巫師 3.

當然真正的 AAA級產品要燒的錢一定少不了,
但如果真的有一個像 100-200規模的製作團隊在認真努力,
那是不是真的有機會做出像太空戰士系列 | 巫師系列 | 密境探險系列 | 刺客教條系列 | .....等類似規模的作品.

先撇開成本考量,
既然真的常夢遊自己在參與 AAA等級的作品,
那我應該認真想像一下自己的 AAA等級定義,
作品應該具備哪些要素.

先只從自己專業的角度來談的話:
Game engine 應該要提供以下的架構:
1. Level of detail for primitive | shaders.
2. Global illumination solution (elegantly designed light | reflection probes ; ambient occlusion).
3. Physically based shading (or styled toon shading).
4. Deferred shading should be considered.
5. High quality shadow. (cascaded + soft shadow)
6. Fascinating image post effect (bloom, god-lighting, lens-flare, depth-of-field, anti-aliasing, ...).
7. Occlusion culling.
8. environment / landscape solution for open world case (terrain | sea | river | sky + weather!).
9. Efficient physics engine (realistic collision). (我最弱的部份)
10. Navigation and path finding.
11. High quality animation control and appearance (complex IK ; vertex animation as blend shapes / morph).
12. Attractive AI (for NPC intelligence and emotions). (沒經驗部份)
13. Character customization (face, hair, body, equipments of avatar).
14. High performance networking service (for MMORPG case). (還沒有經驗).
15. Stable back-end service! (尚不屬於我的領域).
16. Unique and creative mission / task oriented implementation. (讓玩家有事做並覺得有趣)

從這一年來開始認真看 unity 後, 加上以前涉略不深的經驗,
初步歸納有以上的功能算是必備的.

當然除了技術面, 還有美術面與企劃面兩個大方向要談.
美術面從風格到效能運用, 都不是我的專長可以談的, 但可以配合.
企劃面除了玩法的循環之外, 還有一個很重要但常被台灣公司忽略的部份.
就是核心故事!

巫師以及各大 AAA級作品, 幾乎沒有一款是可以不用準備上等的劇情讓玩家去體驗的.
但從自身經歷和其他朋友聽來的經驗,
好像台灣業界總是覺得這是可以先被 cost down的部份.
各核心故事也有重大關聯的另一個要素就是音樂面,
在主題配樂上和音效品質以及配因的成本準備上,
台灣業界也很難做到國外願意投入成本的程度.

以上是我想到的該被提及的要素,
以及自身經驗來談業界有過的盲點(缺點).
不知還有什麼是必須要討論的.

但我總覺得最重要的還是....
要動手做!
要開始動手就不能怕被笑, 笑自己只是愛夢遊.
要怎麼做呢?...
雖然現在 unreal / unity / cryengine 等各大引擎早就提供了各式各類技術面上的支援,
但其實有技術上的支援之外, 還需要團隊開發出自己適合的製程,
產品的成功率才會高.

這些都是眉角, 需要花時間與成本去探所研究的...

反正, 不做, 永遠都只能當成是夢. 就這樣

2017年2月14日 星期二

談 Irrlicht

http://irrlicht.sourceforge.net/

因緣際會之下,
2011年底我換工作來到一家新創遊戲公司,
這家公司的決定讓我覺得很有趣(本來是這樣),
他們想要擁有自家 game engine技術,
想要發展自己的 game development 工具與製程,

而那時他們的選擇是 irrlicht 這款 open sourced game engine.
就這樣開啟了 5 年來我與 irrlicht 交手的過程.

先說結論,
就像任何一個 open source 專案一樣,
irrlicht 管理方都只是用自己 part time的時間幫忙維護與開發.
所以可以想像這是一個你看完 demo 之後,
其他功能要什麼沒什麼的工具.
唯一可說嘴的就是 source code 可以無用途限制地讓人修改.

但世界上最有名的一句名言即是:
"免錢的最貴".
所以真的要拿這種工具來製作商業產品,
我想只能用 painful 來形容了.

大致上介紹一下它的架構:
以 source code 來分析的話, irrlicht 主要分為以下幾個 component:
1. VideoDriver : 處理所有繪圖底層與資源相關 API 功能.
2. SceneManager : 場景管理相關功能與演算法.
3. FileSystem : 檔案系統化處理功能.
4. GUIEnvironment : 處理 UI, 最悲劇的部份.
5. Device : 實作各平台視窗顯示與遊戲啟動機制, 坦白說這部份他們做的還蠻用心的.

嗯, 主要的都介紹完了,
那麼重點來了, 是的, 它們並沒有提供 editor (當然他們沒有義務).
但沒有 editor 也是個嚴重的問題,
因此當時我們公司的做法是找到幫 irrcliht 實作過 editor 的某個第三方對象,
直接跟他們購買 source code, 拿回來做我們要的客製化.

再來接下來就是抱怨時間了(誤).
可以透過以下幾個描述來說明"免錢的最貴" 這點.

首先官方自己在 stable release 版中支援的底層 graphics API 只有:
1. D3D8, D3D9,
2. OpenGL 1.x-2.0 (fixed function + programmable).
3. 他們自己寫的 software based driver(看起來比較像是學術研究用途).

因此第一個面對到的情況便是:
如果真的打算用 OpenGL 3.x+ 以上的功能,
就必須自己全部 wrap 一遍, 重寫自己的 video driver.
而更嚴重的問題便是,
想當然地他們官方還沒開始正式支援 OpenGL ES API.
雖然有很多第三方的人幫忙他們擴充,
但直到現在, 仍沒有正式將那些 iOS/Android branch merge 回到 stable release版.
也因此, 在3-4年前我們開始正式啟動手機遊戲開發時,
我們必須有人去 merge 那些 code.
除了 OpenGL ES API之外, 同時還要處理相關圖檔格式的支援,
如 ETC, PVR, webp 等.
以上種種, 當時我們剛好有神人級同事幫忙 carry,
在很快的時間內補完這些功能,
才讓手機遊戲專案避免延遲進度的災難.

另外就是對美術與企劃同事來說要面對的災難級問題:
編輯器.
之前已提過我們必須自己改寫自己要用的編輯器,
也因此編輯器上的所有功能都必須自行想辦法解決,
當然寫出來的功能方便性無法與其他商用工具相比,
結果就變成編輯能力有限, 又讓同事邊用邊罵的工具了.

其實平心而論,
irrlicht 還是對開發者很友善的 open source 團體,
畢竟他們提供的一切都是免費開放, 並同意任何用途的修改的.
我們的製作團隊就在靠自己雙手的情況下,
陸續補完重要的模組:
shaders (lighting / transparent / reflection / refraction / ...)
shadow mapping,
image / mesh import,
particle system,
animation effect editor,
navigation,
parallel processing (for animation / skinning / ...),
state machine,
....
之後, 像跑過一次有點奇幻的旅程般, 把遊戲即時完成並成功上架.

坦白講我一開始聽到要接手 irrlicht 時我還覺得可能蠻有趣的,
但老實說最後我對這個過程只留下負評.
重點即是我們花了太多工時在做本來不必做的事.
很多功能諸如 image / mesh ; navigation ; UI 等等,
在使用其他 engine 工具時都是可以不必花這麼多時間去處理的,
這樣拖慢了開發進度,
但同時對公司整體的開發能量又沒有太大幫助,
(因為我們開發出來的工具連公司內部其他同事都不會去用).

So,
大致上 5 年來的使用經驗介紹到此.
有興趣的人也可以去官網下載來玩, 跑一些他們的 sample.