點此看看板娘介紹
(這篇同時發在巴哈姆特)
艾莉兒:大家好!這是我們第一次在文章裡演出,請各位多指教。
艾莉兒:那開始吧。主人想在下一個遊戲做一個改變:使用3D模型,我們必須追加3D的能力。
所以主人這幾天一直在幫我們升級,這次主人分享他的開發經過。
-1.載入模型檔-
檔案格式用PMD(MikuMikuDance的模型檔),它的構造幾乎就是按照Direct3D和OpenGL函式的需求,只要很少的轉換。
參考資料:PMD檔案格式
先只讀取頂點、index和材質,骨骼和IK沒有使用,現在先不做動態。
艾莉兒:先請Python姊姊解析裡面的資料。
艾莉兒:Python姊姊的報告來了
model name ちび霊夢GL ちび霊夢 Ver.G_L |
艾莉兒:再來才開始改造我。
(now coding)
弄好了,讀取模型並用printf輸出其中幾個數值看看。
艾莉兒:……(執行中)(顯示資料),主人,這樣對嗎?
有錯誤,要改一下。
(now coding)
再試試看。
艾莉兒:……(執行中)(顯示資料),現在呢?
好,OK了。
-2.坐標轉換和shader-
之前Cyber Sprite這個2D遊戲就用過矩陣和shader,對這方面並不陌生,但是寫3D程式還是第一次。
把書上和網路上看來的公式寫進去,「投影矩陣[2][2]=(zFar+zNear)/(zNear-zFar)」、「diffuse=法線與光源位置內積」等等的。
打光跳過per-vertex lighting,直接用per-pixel lighting。
艾莉兒,功能追加好了,試試看吧
艾莉兒:好,拿出剛剛載入的模型,看我的!
艾莉兒:總算秀得出東西了,可是我還不會用貼圖,只能先秀我算出的打光強度。
中間卡在一個地方,用OpenGL的glFrustum()算投影矩陣畫面會一片黑,卡了一陣子才發現glFrustum把Z>0視為鏡頭背後,Z<0才在鏡頭前面(即右手坐標系),而我把模型位置Z坐標設為正值。因為想配合PMD的左手坐標系,只能自己算矩陣而不能用OpenGL的函式。
艾莉兒:還有一次開啟depth test畫面也變一片黑,結果是沒幫我配置Z buffer。
嗯,是啊,很多細節是慢慢試才弄對。
-3.貼圖-
首先做個準備,這兩個模型原本的貼圖是BMP和TGA,但艾莉兒能用的是PNG和JPG,所以要把圖檔轉成PNG,並且修改模型檔裡的貼圖檔名(再寫一個Python程式)。
艾莉兒:讀PNG以前就做過,沒問題,幫我改一下shader就好了。
艾莉兒:看起來比較完整了,可是主人還想改一個地方。
-4.修改材質-
這一步用PMXEditor做,修改一些材質的ambient顏色。
艾莉兒:對了,Patchouli的袖子為什麼凹下一塊?
我看看……,有一個頂點的法線有錯,改一下。
我寫了兩種打光演算法,來試試看。
艾莉兒:好的。
艾莉兒:顏色好看多了,不是灰壓壓的。
這來自我畫圖的經驗,暗處不能單純降低明度,彩度和色相也要調整,這裡把皮膚和衣服的ambient設成偏紅,頭髮也有調整,改變材質在暗處的顏色。
艾莉兒:原來畫圖技術也能用在寫程式。
測試用的模型檔
靈夢
Patchouli
分別是3萬多和5萬多面,其實不適合用在遊戲裡。
艾莉兒:對呀,處理這麼多面,這麼多材質的模型好累。
艾莉兒:新招完成啦,不管什麼模型矩陣打光儘管來吧!
艾莉兒:咦,你問鈷寶哪裡去了?沒錯,這次先做引擎本體,也就是我的部分。
主人接著要研究輔助工具,到時候就換鈷寶表現了。
鈷寶:嗯,再來就輪到我了。
下一步是研究編輯模型的軟體,有需要的話自己做輔助工具,把整個生產線架出來。
沒有留言 :
張貼留言