Re: [請益] 請教 Normal Map 的相關問題
推
07/10 01:15,
07/10 01:15
→
07/10 01:16,
07/10 01:16
推
07/10 16:42,
07/10 16:42
我目前的作法就是靠 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的結果 與 皮膚材質 做合成 ...
---
感謝你看完這邊文章 ...
最後 還是請版上的前輩 可以給予小弟指導與建議 謝謝大家 <(_ _)>
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 211.76.190.21
推
07/13 15:25, , 1F
07/13 15:25, 1F
→
07/13 15:25, , 2F
07/13 15:25, 2F
剛剛再測試一次 連結是測試圖片 : http://0rz.tw/hUpBc
光線的位置座標為 ( 0, 0 ,175 )
圖片由上至下三張圖片的 Mesh座標 依序為 :
1. Mesh-1 ( -30 , -30 , 100)
2. Mesh-2 ( -190 , 35 , 90)
3. Mesh-3 ( 180 , -160 , 100)
到這邊我又想到一個問題 如果是 平行光 那個他只有方向性 沒有 Position
那麼 平行光 是要如何算出他與 Mesh 的 向量 是多少呢??
謝謝你的建議 麻煩請你再幫幫忙 給點建議 非常感謝你 謝謝 <(_ _)> ...
※ 編輯: pleaselouis 來自: 211.76.190.21 (07/13 16:05)
→
07/13 16:19, , 3F
07/13 16:19, 3F
推
07/13 16:28, , 4F
07/13 16:28, 4F
推
07/13 16:38, , 5F
07/13 16:38, 5F
→
07/13 16:39, , 6F
07/13 16:39, 6F
→
07/13 16:43, , 7F
07/13 16:43, 7F
→
07/13 18:17, , 8F
07/13 18:17, 8F
→
07/13 18:19, , 9F
07/13 18:19, 9F
推
07/14 03:35, , 10F
07/14 03:35, 10F
→
07/14 03:36, , 11F
07/14 03:36, 11F
→
07/14 03:39, , 12F
07/14 03:39, 12F
→
07/14 03:39, , 13F
07/14 03:39, 13F
→
07/14 09:32, , 14F
07/14 09:32, 14F
→
07/14 09:33, , 15F
07/14 09:33, 15F
→
07/14 09:34, , 16F
07/14 09:34, 16F
→
07/14 09:34, , 17F
07/14 09:34, 17F
→
07/14 09:35, , 18F
07/14 09:35, 18F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 5 之 5 篇):