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;
}
什麼我可以做錯了任何想法?
代碼看起來不錯。確保正確計算法線和切線。另外請記住,NormalSample在世界空間中返回正常值,所以您應該在世界空間中進行照明。如果將normalMapSample設置爲固定值(0.5,0.5,1),而不是對紋理進行採樣,會發生什麼情況? – miloszmaki 2013-02-20 15:31:36
好的,我實際上是使用不同的照明模型來實現我的照明,並會給出更新。我認爲我現在所做的錯在於我沒有正確地轉換切線空間,世界空間和模型空間之間的矢量。 – Miguel 2013-02-21 00:47:28