電腦遊戲製作開發設計論壇 首頁 電腦遊戲製作開發設計論壇
任何可以在PC上跑的遊戲都可以討論,主要以遊戲之製作開發為主軸,希望讓台灣的遊戲人有個討論、交流、教學、經驗傳承的園地
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入 

Google
請教 Normal Map 的相關問題

 
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式高級班:DirectX、OpenGL及各種圖型函式庫
上一篇主題 :: 下一篇主題  
發表人 內容
pleaselouis
時常出沒的會員


註冊時間: 2008-11-03
文章: 32

504.97 果凍幣

發表發表於: 2009-7-7, PM 8:21 星期二    文章主題: 請教 Normal Map 的相關問題 引言回覆

目前小弟正在研究 Normal Map 中...

主要是參考下面兩個網頁的教學

1.中文WIKI教學
http://zh.wikipedia.org/w/index.php?title=%E6%B3%95%E5%90%91%E6%98%A0%E5%B0%84&variant=zh-tw

2.一個外國的DirectX範例程式教學 左選單的 Downloads 便可以下載範例
http://www.two-kings.de/tutorials/dxgraphics/dxgraphics14.html

這兩個教學網頁 都是以幾乎一樣的方式呈現Normal Map這個技術

但是關於其中幾點 不是很了解 故來此請教各位前輩

以第一個WIKI網頁中的程式碼舉例 其中有一個function:

"DWORD Vector2ARGB(D3DXVECTOR3 *v,float height)"

其參數 D3DXVECTOR3 *v 我參考第二個網頁內的範例程式

我原本認為這個參數 應該是指 光線的"向量座標" 於是我以下列的方式求值

光線的"向量座標" = 3D物件的座標 - 光線的座標

然後將其填入 Vector2ARGB 中...但是結果完全錯誤...

而我將其參數定為 (-0.7f,0.0f,0.5f) 時 結果看起來好像還算不錯...

因此我想我對於其參數的認知是錯誤的 希望可以有前輩給我一些指導來了解

另外 根據WIKI網頁中提到 其原理為"光源的單位向量與表面法線單位向量做點積"

但若是場景內有複數以上的燈光 那麼應該要如何呢??

麻煩版上的前輩 給小弟一些指導與建議 謝謝大家 <(_ _)>
回頂端
檢視會員個人資料 發送私人訊息
pleaselouis
時常出沒的會員


註冊時間: 2008-11-03
文章: 32

504.97 果凍幣

發表發表於: 2009-7-8, PM 4:04 星期三    文章主題: 引言回覆

我知道我的問題所在了 原來是沒有做 正規化...<囧"

只需要將我之前提到的 : 光線的"向量座標" = 3D物件的座標 - 光線的座標

將光線的"向量座標" 丟到 D3DXVec3Normalize() 內就可以了

但是我還是不太了解 在擁有複數光源的場景中 要如何判定

目前我的想法是將所有的 光線與3D物件的"距離" 作排序

將距離最近的燈光 設定為 Normal Map 的參數

但是這樣一來的話 就只有一組燈光會對3D物件有 Normal Map 的效果

目前我對 打光 的認知是每個多邊形的"頂點" 根據其受到的光的顏色

作內插法運算 藉此達到讓多邊形有顏色漸層的視覺效果

當然還有關於打光的種類 : 點光源 平行光源 聚光燈 也有基礎的認識

但是就我目前的所知的資訊 對於如何解決問題依然是沒有任何的頭緒

因此希望可以請版上的前輩 再度給小弟一些建議與指導 謝謝大家 <(_ _)>
回頂端
檢視會員個人資料 發送私人訊息
pleaselouis
時常出沒的會員


註冊時間: 2008-11-03
文章: 32

504.97 果凍幣

發表發表於: 2009-7-13, PM 2:41 星期一    文章主題: 引言回覆

我目前的作法是靠 texture stage state 來實做 Normal Map 技術

也就是根據前文有提到的 中文WIKI內的教學文件 : http://0rz.tw/eXR4W

以下為教學網頁連結內的 程式碼範例 以及我對其的理解 如有謬誤 煩請指正 :

---
DWORD Vector2ARGB(D3DXVECTOR3 *v,float height)
{
DWORD r=(DWORD)(127.0f*v->x+128.0f);
DWORD g=(DWORD)(127.0f*v->y+128.0f);
DWORD b=(DWORD)(127.0f*v->z+128.0f);
DWORD a=(DWORD)(255.0f*height);
return((a<<24L)+(r<<16L)+(g<<8L)+b);
}


上面這一段 是困擾我最多的地方 也就是我一直搞不太懂參數 D3DXVECTOR3 *v 的定義

教學網頁連結內 的內容有提到 :

"從濃淡點到光源的單位向量與表面法線單位向量做點積,得到的結果就是光線在表面上的強度。"

因此之前才會以 : 光線的"向量座標" = 3D物件的座標 - 光線的座標 當作參數v作測試

只是我現在把他反過來測試 : 光線的"向量座標" = 光線的座標 -3D物件的座標

這樣測試出來的結果 兩者都是雖然Mesh的確會有出現明顯的 凹凸陰影效果 ...

但只要將 Mesh 移動離光源遠一點 就會出現表面幾乎全黑的現象 雖然還是有表現凹凸感

也就是出現這樣的情況 : http://0rz.tw/4wD6p 上圖為靠近光源 下圖為遠離光源 的情形

但是我有在網路上另外找到另一個範例 是使用 Tangent Space 做運算

然後再把值填入 每一個 vertex 的 diffuse 實做 Normal Map 技術

這個範例 就算我將光源設定離開Mesh很遠 也不會出現我上述變黑的情形發生

我目前仍是認為 應該我將 參數v 的定義誤會 或是忽略少做了什麼運算 ...

因此才再度來請益 請版上的前輩 可以給予小弟指導與建議 謝謝大家 <(_ _)>

---
D3DXComputeNormalMap(pNormalMap,pHeightMap,NULL,0,D3D_CHANNEL_RED,1.0f);

由於我自己已經有用 美術軟體產生的 法向量圖 所以並沒又使用這一行程式碼
---

DWORD F=Vector2ARGB(&light,0.0f);
pD->SetRenderState(D3DRS_TEXTUREFACTOR,F);

這邊實際使用到 函式Vector2ARGB() 而其參數又定名為 "light"

但是其回傳的DWORD F 又只有使用 SetRenderState 將其填入 並非針對每一個vertex

因此我才會有關於 複數盞燈光的情況下 應該如何設定的疑問產生??

至今我還是沒有理出頭緒...煩請版上的前輩 為小弟解答...

---
pD->SetTexture(1,pTEXTURE);
pD->SetTexture(0,pNormalMap);
pD->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
pD->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_DOTPRODUCT3);
pD->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_TFACTOR);
pD->SetTextureStageState(1,D3DTSS_COLORARG1,D3DTA_TEXTURE);
pD->SetTextureStageState(1,D3DTSS_COLOROP,D3DTOP_MODULATE);
pD->SetTextureStageState(1,D3DTSS_COLORARG2,D3DTA_CURRENT);

這邊則是網路上的範例幾乎都一樣 所以應該是沒有問題的...

首先先把法向量圖 與 TFACTOR 作點乘積的運算 算出其代表的 光暗凹凸陰影面

再使用 MODULATE 將 Stage-0的結果 與 皮膚材質 做合成 ...

---

感謝你看完這邊文章 ...

最後 還是請版上的前輩 可以給予小弟指導與建議 謝謝大家 <(_ _)>
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式高級班:DirectX、OpenGL及各種圖型函式庫 所有的時間均為 台灣時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
可以 在這個版面附加檔案
可以 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作