看板 GameDesign 關於我們 聯絡資訊
scottnien:normal map也可以用texture combine來做 不一定要用 07/10 01:15
scottnien:pixel shader.. 07/10 01:16
songfat:推一樓。可以用texture stage state 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
NDark:mesh移動離光源遠 這邊容易搞混 最好直接給光與物體的座標 07/13 15:25
NDark:說不定光跑到反向也不一定 07/13 15:25
剛剛再測試一次 連結是測試圖片 : 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)
pleaselouis:忘記說 我算完向量 有做 正規化 Normalize 的動作 07/13 16:19
NDark:平行光有方向 可視作無窮遠的點 07/13 16:28
NDark:然後要確定 錯誤是 光源位置 造成的(把NorMap關掉試) 07/13 16:38
NDark:還是 Normal Map內部你有地方算錯了. 07/13 16:39
NDark:然後 D3DRS_TEXTUREFACTOR 這是在定義multi-text的混色 07/13 16:43
pleaselouis:有試過將Normal Map關閉過 應該是其他因素的說... 07/13 18:17
pleaselouis:謝謝你的建議 我再努力去找找看我的錯誤 07/13 18:19
scottnien:你的normal map如果是tangent space的..那麼傳進去的 07/14 03:35
scottnien:光向量也應該是tangent space的. 07/14 03:36
scottnien:因為每個端點的tangent space都不一樣.所以每個點都要 07/14 03:39
scottnien:計算..而不是像範例中只傳進單一個向量.. 07/14 03:39
pleaselouis:請問有網友有找到使用 Texture Stage State 實做 07/14 09:32
pleaselouis:Normal Map 且有用到 Tangent space 的範例供參考嗎?? 07/14 09:33
pleaselouis:我個人找到使用 Texture Stage State 的範例 都不是針 07/14 09:34
pleaselouis:對Mesh的每一個頂點做運算 讓我很困擾 請大家幫幫忙 07/14 09:34
pleaselouis:謝謝大家的幫忙 感謝大家 謝謝 <(_ _)> 07/14 09:35