2019-03-20

【進度】2019年2月~3月的進度 (1)

一如往常的進度文,寫成筆者和手下的電子妖精研究的過程。
這次寫得簡略一些,不想花很多時間寫。

同時發在巴哈姆特

雖然兩位電子妖精已經登場好幾次,最近才寫了篇介紹讓人認識她們,並把外型定個標準規格。
C.S.Lab看板娘介紹

再說明一次程式碼框的顏色,粉紅色框是引擎本體,黃色框是shader。



FF33前後解決了幾個疑難雜症。

FF33前一天檢查設備時,開一代1.05版測試,發現兩個問題。

1. 一開遊戲就會當掉。
用map檔檢查看看哪裡有問題。艾莉兒,來幫忙吧。

…………

是初始化WIC時這一行。
CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
  IID_IWICImagingFactory, (void**)&gpfd->wicFactory);

查了一下MSDN
What's New in WIC
如果使用Windows 8 SDK編譯,CLSID_WICImagingFactory會等於CLSID_WICImagingFactory2,這個class在Windows 8系統內建,但是Windows 7要更新到新版才有。WIC初始化失敗之後就不能正常執行了。

要改成這樣才行
CoCreateInstance(CLSID_WICImagingFactory1NULL, CLSCTX_INPROC_SERVER,
  IID_IWICImagingFactory, (void**)&gpfd->wicFactory);

至於WIC是什麼?是Windows內建的函式庫,我用它來讀取圖檔,以前寫過一篇用法教學。
【程式】讀取圖檔的方法-Windows篇

————————

2. 顯示關卡名稱的欄位變成這樣。


此欄位換字時是先把圖清除,再畫新的字上去,但似乎「把圖清除」這一步沒成功,之後畫的字就疊在上面。

遊戲裡有哪個地方code寫錯嗎?看一下。
艾莉兒:嗯……好像沒有啊,而且在其他電腦上跑不是都沒問題嗎?

這台是專門在活動時展示的小筆電,作業系統是Windows 7,已有大約兩年沒更新,跑一下Windows Update看看。

…………
(Windows Update有夠久,還好我是電腦放在那邊跑,人去做其他事)
…………
(3小時後)

艾莉兒:咦,這樣就沒事了。
遊戲code一個字都沒改。
艾莉兒:那個,上次展出之後有修改什麼地方嗎?

我想一下,有把畫字的底層從GetGlyphOutline()換成DirectWrite,或許是那一版Windows 7的DirectWrite有問題。
不過「把圖清除」我是用memset()清除一塊記憶體的方式,沒有用Direct2D和DirectWrite的函式,不知為何跟DirectWrite有關。

然後試一下第一個問題的CLSID_WICImagingFactory2,結果更新Windows之後CLSID_WICImagingFactory2也可以用了。

總之確定兩個問題都是更新Windows就可以解決,遊戲不用急著發1.06版。
本社團人力有限,我也想全力做二代而儘量不要分出心力弄一代。

————————

3. 回來弄二代,要把shadow map實裝進遊戲了。

另一個bug,下半部有多餘的影子。


FF33有帶筆電去攤位上弄,但一直查不出原因。
回家之後再查發現是個粗心的錯誤:zFar不夠大。
(這跟3D坐標轉換有關,計算投影矩陣時要給Z最大和最小值)

————————

4. 在Linux上跑一下看看。在Windows上每做好一些部分就移到Linux開發機,做Linux對應的部分,如果修改的地方太多才來弄Linux版就不好改了。

艾莉兒:咦,沒有畫面。

用之前找到的debug工具:apitrace看看
左邊會列出執行過程中有呼叫的OpenGL函式,點選其中一個函式,右邊會顯示此時的貼圖和framebuffer狀態。


看起來載入貼圖、建立framebuffer沒問題,只是glDrawElement()畫不出東西。

找個純2D,不畫3D的程式來試試看。

艾莉兒:用哪一個程式呢?用這個好了,以前測試碰撞判定演算法用的。

有畫面。

艾莉兒:另一個桯式,測試複合型plane的。

畫不出東西。

兩者差別是前者用uniform變數指定顏色,後者有讀貼圖。
修改一下shader,把讀取貼圖的指令拿掉就可以在畫面上顯示東西了,確定是shader不能讀取貼圖的問題。
不過是哪裡出問題呢?以前讓我卡關兩天的 GL_TEXTURE_MAX_LEVEL 確定沒有設錯。
把引擎裡建立貼圖的地方,或是shader修改一下看有什麼變化……,還是找不到。

艾莉兒、鈷寶:(討論中)
你們有發現什麼嗎?

艾莉兒:那個,我好像找到了。
shader裡有這一段,鈷寶,給主人看。


鈷寶:
layout(location=0) in vec2 pos;
layout(location=1) in vec2 texCoord;
layout(location=2) in vec4 color;

艾莉兒:但我這裡是這樣。
enum{
VERTEXATTR_POS2 = 0, //2D position
VERTEXATTR_POS3, //3D position
VERTEXATTR_TEXCOORDP, //以pixel為單位
VERTEXATTR_TEXCOORDN, //normalized
VERTEXATTR_COLOR,
VERTEXATTR_NORMAL,
};

原來在這裡,以前修改一個地方,改了C++但忘了改shader裡對應的部分。
為了簡化vertex attribute的設定,把2D和3D的attribute ID用不重覆的整數定義,但忘了改shader裡的ID設定。

2D要改成這樣,location要跟上面enum裡的數值對應。
layout(location=0) in vec2 pos;
layout(location=2) in vec2 texCoord;
layout(location=4) in vec4 color;

3D要這樣
layout(location=1) in vec3 inPos;
layout(location=3) in vec2 inTexCoord;
layout(location=5) in vec3 inNormal;

也是自己不小心造成的,不過分享一下經驗,提醒大家哪裡要小心。



之後就如「如果辭職在家做獨立遊戲?」說的,覺得長期一個人關在家裡製作會累積焦慮感,不調整生活不行了。
檢討一下發現我焦慮的最大原因是「沒有正職工作」,於是三月頭幾天先處理找工作的事,然後做一些做遊戲以外的事轉換心情,畫畫可愛的看板娘,就是開頭那篇看板娘介紹。

把生活調整一下,且跟一些朋友聊過後勇氣漸漸恢復了,做遊戲的事反正工作之餘有時間就繼續弄。



繼續工作,把延宕很久的第二關背景拿出來弄,結果一弄就碰到幾件鳥事。
  • 鈷寶:那個,主人,OBJ轉PMD……有80000個頂點,不能轉換。
    PMD只能存……65536個頂點。

    艾莉兒:OBJ檔裡只有約30000個頂點不是嗎?
    鈷寶:可是……PMD不支援flat shading,拆頂點之後……就變80000個。

    要把OBJ轉成D3D和OpenGL能吃的格式,結果頂點太多了,為何頂點會增加在下一篇介紹。
    我後來幫艾莉兒和鈷寶做了PMX支援,用PMX就可以儲存超過65536個頂點。不過一個模型用到30000個頂點是太多了點,要叫美術修改一下。
  • 3D美術不會改的話,我自己改也可以,但因為Blender讀取OBJ檔法線會錯,沒辦法在Blender裡修改模型。
有追進度文就會知道我弄3D時常抱怨現成的工具有問題,現在覺得有兩個問題還是要從根本解決,不能一直逃避。
1.支援flat shading。
2.解決Blender讀取OBJ,和輸出PMD,PMX會出錯的問題。

待續,下一篇就來解決這兩個問題。

沒有留言 :

張貼留言