|
電腦遊戲製作開發設計論壇 任何可以在PC上跑的遊戲都可以討論,主要以遊戲之製作開發為主軸,希望讓台灣的遊戲人有個討論、交流、教學、經驗傳承的園地
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
pleaselouis 時常出沒的會員
註冊時間: 2008-11-03 文章: 32
505.97 果凍幣
|
|
回頂端 |
|
|
pleaselouis 時常出沒的會員
註冊時間: 2008-11-03 文章: 32
505.97 果凍幣
|
發表於: 2009-7-8, PM 4:04 星期三 文章主題: |
|
|
我知道我的問題所在了 原來是沒有做 正規化...<囧"
只需要將我之前提到的 : 光線的"向量座標" = 3D物件的座標 - 光線的座標
將光線的"向量座標" 丟到 D3DXVec3Normalize() 內就可以了
但是我還是不太了解 在擁有複數光源的場景中 要如何判定
目前我的想法是將所有的 光線與3D物件的"距離" 作排序
將距離最近的燈光 設定為 Normal Map 的參數
但是這樣一來的話 就只有一組燈光會對3D物件有 Normal Map 的效果
目前我對 打光 的認知是每個多邊形的"頂點" 根據其受到的光的顏色
作內插法運算 藉此達到讓多邊形有顏色漸層的視覺效果
當然還有關於打光的種類 : 點光源 平行光源 聚光燈 也有基礎的認識
但是就我目前的所知的資訊 對於如何解決問題依然是沒有任何的頭緒
因此希望可以請版上的前輩 再度給小弟一些建議與指導 謝謝大家 <(_ _)> |
|
回頂端 |
|
|
pleaselouis 時常出沒的會員
註冊時間: 2008-11-03 文章: 32
505.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的結果 與 皮膚材質 做合成 ...
---
感謝你看完這邊文章 ...
最後 還是請版上的前輩 可以給予小弟指導與建議 謝謝大家 <(_ _)> |
|
回頂端 |
|
|
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 可以 在這個版面附加檔案 您 可以 在這個版面下載檔案
|
|