2013-04-06 77 views
1

我正在嘗試使用凹凸貼圖來創建着色器。如何將凹凸貼圖正常與真正的正常組合?

我有對象的真正法線,並且我有凹凸貼圖採樣正常。 我想要做的是旋轉採樣法線,以便在實法線方向上採樣的法線點上「向上」。

我一直在數學工作,我似乎無法得到它的權利...... Y在這個世界上。

// Vertex shader sends this matrix to the pixel shader 
OUT.normal[0] = mul((float3x3)world, normal); 
float3 temptan = cross(normal, float3(0, 0, 1)); 
temptan = normalize(temptan); 
OUT.normal[2] = mul((float3x3)world, temptan); 
OUT.normal[1] = cross(OUT.normal[0], OUT.normal[2]); calculating binormal (in world space) 

// Pixel Shader: 
// Get normal from bump texture 
float3 normal = tex2D(normalmap, texCoord); 
normal = normal * 2 - 1; 
// Swap Z and Y, since Z is up on the texture, but Y is up in this world. 
float temp = normal[1]; 
normal[1] = -normal[2]; 
normal[2] = temp; 
// Multiply the sampled normal and the normal-basis matrix together. 
normal = mul(normalMat, normal); 

回答

4

當你想使用法線貼圖(這是你實際上是由「凹凸貼圖」的意思),你需要爲你打算做什麼兩個額外的矢量:切線副法線。切線和副法線從幾何法線和「凹凸貼圖」的紋理空間計算。

我沒有解釋如何在→my answer to StackOverflow question "How to calculate Tangent and Binormal?"

正常,切線做到這一點,雙正態形成一個座標系,表達作爲一個3×3矩陣。該矩陣實際上是將法線貼圖轉換爲模型局部空間所需的旋轉矩陣,因此您可以將其用於照明計算。總之,你乘以這三個向量的三腳架形成的矩陣。

+0

謝謝!我會讀你的文章。我想我一直在努力去做你上面說過的話,但是我並沒有完全清楚。 – yellow 2013-04-07 03:18:54

+0

請注意,如果您正在談論正切空間正常地圖,只有這種情況,如果您的法線在世界或對象空間中,則不需要。 – 2013-04-25 15:36:15

+0

@RobertJ:世界空間法線是非常不尋常的,只要使用骨骼動畫,對象空間法線就會產生大量問題。但你當然是對的。 – datenwolf 2013-04-25 16:32:28