Sep 13, 2006


最新版本的多光源展示範例程式可以下載了: 範例程式(新加入支援模型檔案格式: fairy.nmb, KingdomHeart mdls)
我的 Blog有提到相關資訊


Apr 18, 2006

最新版本的多光源展示範例程式可以下載了: 範例程式(新加入支援模型檔案格式: 真三國無雙3 的 .xkm)


Feb 16, 2006


更新版本的多光源展示範例程式可以下載了: 範例程式(支援 Square-Enix FFX, FFX-2 的 .ffb 檔案格式(final), 以 Drag-Drop讀取)


Aug 24, 2005

隨手申請了一個 Blog, 果然簡單好用


Mar 21, 2005

Macbear's md5mesh viewer 展示程式: 支援即時投影, 多重光源, bumpmap, perpixel lighting (1.46Mb)
下載Macbear's md5mesh 展示程式

ps: 總算可以下載了, 因為 geocities 最大檔案限制是 1.5Mb; 不過也有流量限制, 所以如果不能下的話, 就晚點再試試看吧...


Feb 7, 2005

又一個教學網站, 包含了 DirectX, OpenGL, C/C++的教學: CodeSampler.com


Feb 3, 2005

新版本的多光源展示範例程式可以下載了: 下載範例程式


Nov 11, 2004

Hotball's Hive :無意間發現的一個中文教學網站, 蠻優的, 就推薦給大家了


Aug 2, 2004

DOOM3明天上市!!!


Jun 8, 2004

真實物理效應的模擬應該會是以後重點吧, 不過不是每個人的物理程度都有那麼好(是說我自己吧), 頂多知道一下牛頓的三大運動定律: 慣性(靜者恆靜,動者恆動), F=ma, 作用力等於反作用力; 所以又稍微找了一下 internet, 發現還有不少頗優的物理引擎可用, 就推薦給需要的人吧:
1. ColDet:這是一個簡單的碰撞偵測函式, 不能算是物理引擎, 不過簡單易用, 只需偵測碰撞的話還蠻實用的(免費, 有原始碼)
2. OPCODE: 也是簡單的碰撞偵測函式, 和 ColDet 類似(有原始碼)
3. Tokama v1: 之前推薦過了 (免費, 無原始碼)
4. Open Dynamic Engine (簡稱ODE): 可模擬車輛, 人物關節, 蠻多人用的, 費用自由贊助 (OpenSource)
5. Havok: 要用買的, 鼎鼎大名的 HL2 就是用這一套, 當然功能強大, 財力雄厚的可以去試試
6. SOILD: 要用買的, 蠻便宜的


Apr 12, 2004

關於真實的即時投影之前介紹過了Shadow Volume, 雖然有一些連結已找不到相關文件了, 不過善用搜尋功能應該還是可以在 internet 找到新連結點吧. 現在再來介紹另一個技巧: Shadow map. 這個 Paul's ShadowMap Tutorial應該算是粉優的一個教學課程, 也包含原始碼, 其他類似的課程有機會再補上來了.
其實Paul's Project 有一堆很棒的範例(含原始碼), 真該謝謝他如此慷慨貢獻, 把他的範例推薦給大家, 讀過的保證受益良多.


Feb 24, 2004

這個免費的網頁空間給的功能真是越來越少了, 所以不得不另覓新窩. 就申請了另一個免費網頁空間http://cc.1asphost.com/macbearchen/來試用看看了, 不過有一個麻煩的問題, 那就是 Geocities ftp 功能現在不開放給免費使用者, 那我之前上傳的東東我也拿不到, 自己的備份又不知去向, 真是傷腦筋...


Feb 18, 2004

最近寫了一個輸出 Doom3 md5mesh 格式的 3DSMAX plugin, 使用了 IGame; 基本上要編譯 3DSMAX SDK 必須先安裝 Microsoft Platform SDK, Platform SDK 可以在微軟官方網站下載, 約 323MB; 而 3DSMAX SDK 下載連結 在此, 所謂的 IGame 就是 Game Export Interface, 它是簡化版的 3DSMAX 檔案輸出函式庫, 算是入門3DSMAX SDK 的好用函式.


Oct 16, 2003

最近在Doom 3 Texture creation討論群組 討論關於凹凸貼圖的實作, 想到一個可以不必使用cubemap, 只需要 DOT3, 就可以做出bumpmap的技巧, 經實作後確實可行, 可簡化所需的 texture-unit.


Sep 25, 2003

來談談凹凸貼圖(Bump mapping), 基本上想要在電腦繪圖上做出有凹凸感覺, 可以更真實的表現出物體的質感, 如何在不增加3D 模型的點面數, 又想表現出凹凸效果, 那就是使用 Bump mapping 的時候了. 其實一些2D 繪圖軟體早就有將圖形凹凸化的效果, 一般就是把圖形灰階化(或灰階反差化, 或使用 heightmap), 平移幾個圖素後, 再跟原始圖形做合成就可以了. 平移點數的多寡決定凹凸的反差量, 灰階亮暗值則決定深淺. 那麼在 3D 繪圖呢? 是不是依樣化葫蘆就可以呢? 理論上是沒錯, 不過在即時繪圖上可能會有速度上的瓶頸, 也因此 nVidia 在 Geforce 系列上有 DOT3 與 Cubemap 的新功能了(ps: TNT 並沒有).
運用 DOT3 與 Cubemap: 首先需要一張 normalmap 貼圖以及 normalize cubemap; 計算模型每個三角面的 TangentSpace (或稱TextureSpace) Matrix, 這個 Matrix 是由 Tangent, Binormal, Normal 構成的, 也就是所謂的 TBN (或稱 STN); 把光源的世界座標轉換為區域座標, 再與 TangentSpace Matrix 計算得到 tangentLight 向量; tangentLight 就是 Cubemap 的 3D 貼圖座標, 把 normalize 與 Cubemap 做 DOT3 的貼圖結合運算就是最後結果了... 好像有點複雜, 不過事實上就是會這麼複雜. 其實還有一些東西要提出來說明的:
a. normalmap: 基本上就是用 RGB 分別表示 XYZ 軸向量值的2D圖形, Red 紅色對應 X 軸, Green 綠色對應 Y 軸, Blue 藍色對應 Z 軸, 顏色值 [0 ~ 255] 表示座標軸值 [-1.0 ~ 1.0], 至於怎麼產生 normalmap? PhotoShop plugin應該合用, 不過要注意圖形原點為左上角或是左下角, 可能有需要上下映射翻轉; Doom3 用更精確的方法建立 normalmap, 就是用高面數的模型來產生, 真厲害.
b. normalize cubemap: 首先了解何謂六面的 cubemap, 就是由立方體的六個(上下左右前後)正方形組成. 正方形的圖形內存放相對應的 normalmap, ex:
正X軸存放的 R=255, G=[0~255], B=[0~255]; 負X軸存放的 R=0, G=[0~255], B=[0~255];
正Y軸存放的 R=[0~255], G=255, B=[0~255]; 負Y軸存放的 R=[0~255], G=0, B=[0~255];
正Z軸存放的 R=[0~255], G=[0~255], B=255; 負Z軸存放的 R=[0~255], G=[0~255], B=0;

c. 三角面的 TangentSpace Matrix 要轉換為頂點的, 方法和法向量計算一樣, 就是把頂點所存在的三角面法向量加總後, 再計算其單位向量(Normalize); Tangent, Binormal 的計算也一樣. 至於 Tangent, Binormal, Normal 要怎麼計算出來呢? 我想這就是最大的麻煩所在了, 高中數學的向量空間有學好的應該不是問題, 忘記的就看書吧. Mathematics for 3D Game Programming & Computer Graphics by Eric Lengyel, 哪裡買? Amazon.
d. 應用在點光源與平行光源: 點光源的世界座標轉換為區域座標比較麻煩, 要一個點光源對應一個模型頂點; 平行光源的世界座標轉換為區域座標就直接用就行了. 可以用 vertex shader (GPU 必須有此功能才行) 來計算這些向量, 不過也可以用 CPU 算, 不透過 GPU 的 vertex shader. 把光源的區域座標乘上 TangentSpace Matrix 就可以得到 tangentLight. 這兩種光源都適用於 diffuse 材質; 不過如果是 specular 材質那麼計算光源的區域座標就有點不同, 也就是要計算出每個頂點的相對於光源的 highlight, 所謂 highlight 就是光源對頂點法向量的反射向量, highlight 與觀察者的內積就是 specular(當然還要加算 shininess). 就先這樣吧, 關於 specular 的部分等研究有心得再說吧.
以下就列出幾個 bumpmap 的範例:

    1. Nutty 的 TangentBump (c++ src), 使用 DOT3&Cubemap; 不過 Tangent, Binormal 的計算有小錯誤, 導致凹凸效果有點怪怪的(光源與凹凸陰影顯示錯誤).
    2. Paul 的 Bump 課程(c++ src),使用 DOT3&Cubemap; 有完整詳細的教學文件和原始檔, 使用 multipass 來繪製; 先畫 bump mapping, 再畫 diffuse map.
    3. Delphi3D 的 TangentBump (delphi src), 使用 DOT3&Cubemap; 算是極品, 程式正確且涵蓋面廣, 雖然是 pascal code, 不過拿來學習應該是也很夠了.
    4. Texture Space Bump Mapping by Sim Dietrich, 是投影片, 簡單扼要的說明 Bump mapping 的原理與實用.
    5. A Practical and Robust Bump-mapping Technique for Today GPUs by Mark Kilgard, 是詳細文件, 說明 Bump mapping, 以及 OpenGL 所需的相關介紹.
    6. Advanced Per-Pixel Lighting and Shadowing (c++ src) by Ron Frazier, 不光光只有Bump mapping, 還包括即時投影算, 平行光源, 點光源, 探照燈, 光線反射 higlight; 相信高級程式師可以在此學到更多技巧.
    ps: 其他關於使用 heightmap bump 或是 emboss bump的就不提了, 因為只適用於單一平面, 如果要用在即時 3D 模型上, 那保證運算會複雜到跑不動, 而且效果也不佳; 雖然不需要有支援 DOT3&Cubemap 功能的 3D 卡(ex: TNT系列) 都可以跑, 但是不支援 DOT3&Cubemap 功能的卡應該算是古董了, 該升級啦.

Sep 4, 2003

避開 OpenGL 16 種常見的陷阱: 這是由 Mark J. Kilgard of nVidia 發表的技巧, 簡介如下:

    1. 要使用 glEnable(GL_RESCALE_NORMAL), 避免用 glEnable(GL_NORMALIZE)
    2. 光與頂點的關係: 單一大塊面與棋盤(tessellation)切割小面對光源效果的影響
    3. 注意 GL_MODELVIEW, GL_PROJEXTION, GL_TEXTURE 的矩陣模式切換: 儘可能都切回最常用的GL_MODELVIEW
    4. GL_PROJEXTION, GL_TEXTURE 矩陣模式的堆疊空間通常只有2個, GL_MODELVIEW 有32個, 要避免堆疊滿溢
    5. 貼圖使用 Mipmap 時用gluBuild2DMipmaps, 不使用 Mipmap 則用 glTexImage2D
    6. glReadPixel 讀取灰階畫面, 注意 glPixelTransferf 設定的 GL_xxx_SCALE, GL_xxx_BIAS
    7. 注意 glPixelStorei 圖像存取位元對齊 GL_PACK_ALIGNMENT, GL_UNPACK_ALIGNMENT, 預設為 4個位元對齊, 通常會使用單一位元對齊
    8. 了解圖像存放狀態 GL_UNPACK_SWAP_BYTES, GL_UNPACK_LSB_FIRST, GL_UNPACK_ROW_LENGTH, GL_UNPACK_SKIP_ROWS, GL_UNPACK_SKIP_PIXELS, GL_UNPACK_ALIGNMENT, 還有 GL_PACK_xxxxxx etc. 注意"圖像存放(pixel store)" 是屬於 client-side state, 要使用 glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT)glPopClientAttrib(GL_CLIENT_PIXEL_STORE_BIT) 作為堆疊的存取
    9. 使用 glRasterPos2f 來設定以下函式的繪製位置 glBitmap, glDrawPixels, glCopyPixels
    10. viewport clip/scissor 的方法
    11. 設定 2D 圖像的色彩, 需要在 glColorf 後呼叫 glRasterPos; 就如同頂點設定 glColorf 後呼叫 glVertex 才會改變頂點顏色
    12. OpenGL 的原點在螢幕的左下角, 可使用 glPixelZoom(1, -1) 來改為左上角, 不過只對 glDrawPisels, glCopyPixels有用; glBitmap, glReadPixels 沒用
    13. glOrtho 設定 2D 平行投影來進行 2D繪製, 不過要注意矩陣模式 GL_PROJECTION
    14. 設定顏色 GL_COLOR_MATERIAL, glColor, glMaterial, glColorMaterial
    15. OpenGL State 會影響一切
    16. depth, stencil, accumulation buffer
詳細說明還是看看原文連結吧!
ps: 其實上面所列的有一些部分是關於 OpenGL 在 2D 上的處理技巧, 不過就個人經驗認為: glBitmap, glRasterPos, glDrawPixels, glCopyPixels 在使用上盡量避免, 因為效能不佳; 如果要在 OpenGL 處理介面或文字等 2D 的東西, 還是建議先把圖形(主記憶體)轉換為材質(顯示卡記憶體), 再用繪製三角形的方法畫出來.
ps2: 文字的部分(尤其是非英語系統的中日韓文等等), 可以先輸出到 Windows GDI 上的 DC (TextOut, DrawText), 再將 DC 的記憶體轉為材質記憶體 (更新材質用glTexSubImage2D), 這樣就可以直接用視窗系統字型了; 畢竟不像英文字最多只要把 ASCII 256個字建出圖形就好了, 所以老外不大會遇到秀字型的問題(這樣的問題問他們也少有解答).

Aug 13, 2003

1. 推薦一個粉棒的物理引擎, 而且是免費的
2. Doom3 Loader, 就是讀取 Doom3 md5mesh, md5anim 的原始程式碼, 下載來看看應該可以增進 3D 功力
3. Intel 的 3D 文件, 其中的骨架動線, 和 NPR 相當值得一讀


以前的新聞 June 11, 2003