2017年9月8日 星期五

開發現況與問題

兩年前我就曾經想參加或協助indie game專案,
當時朋友很認真的回應我: 兼顧本業與副業是很困難辛苦的.
況且我一直以來還想要顧及自己的私人和家庭生活時間.
講真的到目前為止就算我曾經很認真的思考要怎麼同時進行本職工作與indie工作,
其實我跟本還沒成功開始過?

當初開這個blog最主要目的也在於想紀錄自己有沒有能力執行開發進度.
可是超過半年過去了..
很明顯的我應該算是什麼都還沒開始動工吧!
沒有思考與撰寫過設計文件, 沒有真的進行prototype相關的任何開發內容,
只有不停的上網找資料, 閱讀參考文獻與教學,
像今天早上原本想嘗試開發卻又花了兩個小時在整理之前網路上找的資料.
還有花時間休息, 打電動, 並且討價還價不想多花時間陪小孩..
講真的就算知道要創業是很孤獨的,
我現在仍然會對這半年來的進展感到很沮喪.

既然要紀錄這一篇, 重點應該是要面對問題.
最大的問題是時間不夠嗎?
目前選的工作每天至少會花掉14個小時 (4個小時在通勤上).
其實真的算是主要的難題.
在晚上回到家後我常常已經感到自己消耗掉很大的精神體力,
我的身體習慣已經開始說服自己早點休息了.
所以常常在有心想做點什麼事的時候,
我的注意力已無法集中, 甚至有時會累到眼睛快睜不開了.
這種時候當然該休息了..
但也有我還有力氣可是卻得花時間處理家務的情況, 這是避免不了的,
不可能把所有事情留給我老婆處理,
因為她真的已經處理掉超過90% 的事情了,
所以要真的完全不理家人的事只做自己想做的事,
坦白講不太可能 (而且我覺得我已經推掉太多家務事給我老婆了).

既然時間是一主要難題, 但又真的想做點事業的話,
也許我該每週固定排某個時間進行自己的indie工作內容.
目前看來最適合的時間是每週六和日的早上.
這種時候通常比較不會有雜務來打擾或中斷工作.
不過要認真執行這樣的工作時間安排,
我可能也要下定決心不要半調子地把時間花在玩樂或打混,
畢竟過去幾個月的時間就是這樣沒掌握好浪費掉大半去的.
但老實說有時真的覺得壓力很大, 想要把電動補玩一玩放鬆一下,
或是前幾個月想開始練習自己固定的運動活動, 這也會花掉體力和時間.
不知道之後工作與休息和家庭這些重點花費的時間, 我該怎麼平衡呢?
也許該邊嘗試執行計劃並同時思考怎麼調整吧.
畢竟比較累比較遠的工作也是自己選的, 只有抱怨的話也不會對事情有幫助吧.

2017年8月29日 星期二

[譯] 遊戲開發技術解析: 汪達與巨像 (Shadow of the Colossus - PS2)

汪達與巨像是PS2時代末期推出的一款RPG偉大巨作,我在我大學生活的最後一年有幸玩到,陪伴我畢業的那段時間,給予我至今仍然難忘的體驗。

汪達與巨像 (Shadow of the Colossus)
太空戰士 12 (Final Fantasy XII)
女神戰記2 希爾梅莉亞
這3款遊戲都是我印象中在PS2時代末期推出,將PS2主機性能完全操爆突破極限的經典巨作,也可說是日本領先全世界之RPG輝煌時期的代表作。

前陣子在網站上找到有人用心拆解汪達與巨像這款遊戲的開發技術成份,有種挖到寶的心情。
有心想找有空的時候翻譯一些重點出來,結果一拖又是兩個月過去,認真開始找重點翻,也還是花超過兩天才做好

寫文件真的不是件輕鬆的差事。




文件就放到我的slideshare當作成就收藏吧,大家喜歡的話可以去參考看看。
原文在此:http://www.froyok.fr/blog/2012-10-breakdown-shadow-of-the-colossus-pal-ps2

2017年8月12日 星期六

開發日誌 (-1): 毛(fur shader) - 前置研究

為了自己心目中的遊戲,
已經關注 fur rendering 這個技術領域多年了(但還是只看懂皮毛表面)。
看了數篇的文獻和現成的 example shader codes,
每次看幾乎都沒什麼疑問,
知道那些程式在做什麼或為了什麼效果,
但等到真的想實現自己想做的效果時,
又覺得缺了很多專業知識而會導致做不出來。

目前為止看過讓我覺得最簡單易懂的教學網站應該是這個:
http://www.catalinzima.com/xna/tutorials/fur-rendering/
要表現出毛髮的效果基本上就是一個原則,
同樣的毛髮幾何對象依不同厚度切片層次重畫好多次。
每次重畫某層切片時就依照該層厚度(高度)對應的顏色、疏密度以及透明度,
去表現那層次的毛法外觀效果。
其實我感覺就是一個volume rendering的變化作法。
http://www.catalinzima.com/wp-content/uploads/2008/07/layers.jpg

這種分割成大量切片重畫的方式通常被稱為Shells的畫法,
除此之外可以在幾何邊緣或是貼圖紋理不連續的三角面接續處,
安插額外的類billboard切片,
來補足視覺上的破綻。
此種畫法通常被稱為Fins畫法。

所以很多討論毛髮效果的文獻會不停的提到Shells & Fins這樣的名詞。
https://timothythiecke.wordpress.com/portfolio/hlslshader/

有趣的事情是幾年前我就在github上看過open source Unity fur rendering專案。
但我今年要重找時沒有找到適合的open source project(for Unity),
(其實我只是懶的做debugging和migration)
(沒辦法下班時間也實在是很有限)
最後沒耐心的情況下我甘脆去asset store買了一個fur shader(5 USD),
買下來才發現其實就是當年我看到的github專案上幾乎一模一樣的codes XD
也好如果是同作者的話就當作回饋給他吧。
https://www.assetstore.unity3d.com/en/#!/content/66461

試用了該shader後試作出了下面這樣四不像的動物(一隻老虎 XD)。
看來要做的事還有很多:
1. Density control.
2. Height map control.
3. Transparency control.
4. Geometry modification (controlling via vertex colors).
看來還缺很多東西才能開始嘗試..

2017年7月14日 星期五

Career

新公司報到一陣子了,好像有些事積在心裡也不清楚該怎麼表達。因為受不了前公司的人治,所以離開,雖然當初大聲的說這是職場常態,但在新公司遇到一些自己看不慣的鳥事時,還是覺得很煩。到底我是為了什麼換工作呢?我現在一直在思考這個問題。
精確地說,到底為什麼我選了這家新公司呢?
好吧,坦白說只因為錢,我在南台灣找不到更高的薪水了,但家庭的教育費讓我們的口袋快速見底了,所以我必須找到可以補上這個缺口的工作。但我也不是因為這樣就什麼工作就亂找,所以面試時有發生一段插曲。
因為公司要做模擬議題的軟體服務,所以在找懂繪圖與模擬這些領域的人。其實他們在找的技術跟game engine領域超級match,可惜目前我還無法說服大部份的人這點。但不管如何因此他們在職缺裡開了需求,我看到才投resume想去談。然後A部門找我去面試,但跟我說他們還不會做這塊領域,時程上還不允許,但B部門已經開始做了,也許我去B部門會更適合,也因此我也答應B部門的面試。可是後來因為B部門動作太慢,加上我有事情在忙,所以無法和B部門成功約面試,就已經答應去A部門報到了。但進去一陣子後,目前發現B部門才是我真正想待的地方,A部門則是要接觸一塊全新的領域,因此自然而然,我開始有很想轉到B部門的想法。
但問題不止在此,我在面試時都會談請楚,後端(networking / database)是我的弱項,我不會想去接這種工作內容,對方也都理解,而剛進去時要接觸的也是比較偏compiler領域的計術,這也是面試時有提過的,而去學這種東西我覺得我還吃的下去。但上週突然間,上層主管只傳達一個很簡短的訊息,因為人手不足,要求我待的team去接手後端服務的主要工具工作,說真的我很不喜歡這樣子,先不說我面試時就談好我networking完全不行,我強的是其他地方,他們也是因為我的強項找我進去而不是因為我全方面都會做,但現在突然間傳達一個命令就要另一個 team接手,但理由聽起來又前後矛盾讓人感到牽強,無法理解上面管理層的想法和脈絡,加上開會的氣氛。諸如以上各種理由,加深我想要轉換去B部門做事的想法,更甚者,我開始想著為什麼我現在在做這些事。
這種工作從來不是我心中想做的事,我心中隨時隨地都在想著遊戲開發,我看到的任何畫面/文字/材料/內容我都會下意識地跟遊戲開發技術去聯想,我一直想做的就是做出我心目中真正的遊戲。那為什麼我沒有選這種工作呢?如果是錢的問題的話,其實前公司可以讓我苟延殘喘繼續待著,也不會立刻遇到現金流的缺口問題,但看著老闆親自亂搞底下認真做事的人,我完全無法認同,可說有點意氣用事的情況下我急著辭職不幹。那這些年來我到底在幹什麼呢?我的堅持到底是什麼?
理性看待這個問題,如果小孩的教育費需要,我何不就當個奴材忍個幾年看看做不做的下去,這樣至少薪水有個保障。但撇開新單位我到底喜不喜歡,B部門才是我真正喜歡做的內容,我現在當然會想轉換過去,可是這是我真正想要的嗎?也許我跟本不想待在這個公司,我渴望立刻開始執行自己的計劃、夢想。可是這叫做勇敢還是逃避呢?會不會這一切的抱怨,只是因為我草莓、抗壓性不夠罷了?
最近有點煩這些事。

2017年6月9日 星期五

Lava shader in Unity

上一篇時,之前在 GameDesign 版上有發文
順便問問題
在推文中幾次來回討論之下
決定應該把 shader 試一遍才對

不過之前的 demo 影片所使用的專案是在前公司時期開發
要還原那時候的專案建置環境太麻煩
所以就交給 Unity 吧!

放上去 github,有興趣的可以拿去用 (這次就不留註解了,最近忙)
https://github.com/riveranb/UnityLava

有什麼意見的話歡迎討論交流
最後放上一張早期試開發 lava shader時所留下的珍貴截圖
那時我朋友都稱之為 "泡麵 shader" !! XD



更新 : 既然做好 Unity5 版,索性就放到 Unity Forum 上留個紀念吧XD

2017年5月27日 星期六

lava shader code example

http://irrnetcp.proboards.com/thread/2/lava-shader-hlsl

上一篇有提到當時 Google 大神引導我到一篇超佛心 post,
讓我看到我大腦一直無法解開的 optimized lava shader solution 難題!
就像佛心大大分享一身功夫完全不求回報一樣。
都提到了我就順便就我理解的部份說明一下 lava shader 的運作流程。

但先說明我的數學也很爛,
所以直到現在還是有幾行關鍵的 condition 看不懂 XD
既然是要分享我註解就盡量寫中文好了
不過我是預設讀者看的懂 gpu shader code就是囉。

我所理解的有限,有人發現我寫錯的可以打我臉 XD
當然歡迎有緣佛心大大來教我我也不懂的地方 XD

code snippets (HLSL)
===================================================
float4x4 mWorldViewProj; // World * View * Projection transformation
struct VS_OUTPUT
{
float4 Position : POSITION; // vertex position
float2 TexCoord : TEXCOORD0; // tex coords
};
// vertex shader 沒做任何特別的事情
VS_OUTPUT vertexMain( in float4 vPosition : POSITION,
float2 texCoord : TEXCOORD0 )
{
VS_OUTPUT Output;
// transform position to clip space
Output.Position = mul(vPosition, mWorldViewProj);
Output.TexCoord = texCoord;
return Output;
}

struct PS_OUTPUT
{
float4 RGBColor : COLOR0; // Pixel color
};
float time;
sampler2D tex0;
sampler2D tex1;
PS_OUTPUT pixelMain( float2 TexCoord : TEXCOORD0,
float4 Position : POSITION )
{
PS_OUTPUT Output;
    // tex0 是作者準備的noise map, 作者將它視為normal map去應用
float4 noise = tex2D( tex0, TexCoord ); // sample color map
    // 計算 2 組UV位移分量, 時間參數在此代入影響
float2 T1 = TexCoord + float2(1.5,-1.5)*time*0.02;
float2 T2 = TexCoord + float2(-0.5,2.0)*time*0.01;
    // noise.xyz 分別代表tangent space(我譯為切線空間)中的x, z, y軸分量(xz平面視為水平面)
    // T1.xy = noize.xy * 2 + T1.xy; 也就是noise空間的 xz 水平位移量影響T1
T1.x += (noise.x)*2.0;
T1.y += (noise.y)*2.0;
    // T2.xy = noize.yz * 2 + T2.xy; 也就是noize空間的 yz 垂直面位移量影響T2
T2.x += (noise.y)*0.2;
T2.y += (noise.z)*0.2;
    // 由T1再次對 tex0 (noise map)做fetch, 取得T1擾動影響後alpha結果 (p = noise.a)
float p = tex2D( tex0, T1*2.0).a;
    // 以T2由 tex1 (lava炎漿貼圖) 去取得炎漿的原色
float4 col = tex2D( tex1, T2*2.0 );
    // 神奇的數學來了, 我頭開始痛惹
    // col 被 p * 2 影響後再加上自身 col * col - 0.1, 明顯是一個高亮度曝光的動作
float4 temp = col*(float4(p,p,p,p)*2.0)+(col*col-0.1);
    // 這 3 個 if condition 我真的無法解釋 = =, 但最關鍵的就在這辣rrrrr
if(temp.r > 1.0 ) { temp.bg += clamp(temp.r-2.0,0.0,100.0); }
if(temp.g > 1.0 ) { temp.rb += temp.g-1.0; }
if(temp.b > 1.0 ) { temp.rg += temp.b-1.0; }
    // Jobs done.  QQ
Output.RGBColor = temp;

return Output;
}
===================================================

所以這個 shader 需要準備什麼貼圖呢
tex0 : noise(rgba),雖然我的解釋中提到它被我當成 normal map,但事實上r , g, b, a各 channel 都只準備了各自不同地 4 方連續 Perlin noise pattern,而其中 r, g, b 之後主要去影響的是擾動變形;a 則是炎漿的亮度曝光效果主要影響因子。

tex1 : lava,也需要是 4 方連續的 pattern。

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