2013-02-20 71 views
2

所以,好的。我試圖在我的小遊戲引擎中實現正常的映射,但我無法使其正常工作。執行標準映射HLSL

當我按照每個頂點法線進行照明時,一切都很好,但是如果我嘗試使用法線貼圖進行操作,那麼一切都會分崩離析。

我知道我有正確的UVs,因爲紋理看起來不錯,但我不知道我在做法線貼圖紋理時做錯了什麼。

這是我的像素着色器(HLSL)我的一些代碼....

float3 NormalSample(float3 normalMapSample, float3 unitNormalW, float3 tangentW) 
{ 
    //Uncompress each component from [0,1] to [-1,1] 
    float3 normalT = 2.0f*normalMapSample - 1.0f; 
    // Build orthonormal basis. 
    float3 N = unitNormalW; 
    float3 T = normalize(tangentW - dot(tangentW, N)*N); 
    float3 B = cross(N, T); 

    float3x3 TBN = float3x3(T, B, N); 

    // Transform from tangent space to world space. 
    float3 bumpedNormalW = mul(normalT, TBN); 

    return bumpedNormalW; 
} 

什麼我可以做錯了任何想法?

+2

代碼看起來不錯。確保正確計算法線和切線。另外請記住,NormalSample在世界空間中返回正常值,所以您應該在世界空間中進行照明。如果將normalMapSample設置爲固定值(0.5,0.5,1),而不是對紋理進行採樣,會發生什麼情況? – miloszmaki 2013-02-20 15:31:36

+0

好的,我實際上是使用不同的照明模型來實現我的照明,並會給出更新。我認爲我現在所做的錯在於我沒有正確地轉換切線空間,世界空間和模型空間之間的矢量。 – Miguel 2013-02-21 00:47:28

回答

3

好的,我修好了。我只是在錯誤的座標空間中進行正常計算。爲了更容易,我決定在模型空間中做所有事情。看起來不錯。太糟糕了,我不允許發佈屏幕截圖。

再次感謝Miloszmaki ....