2013-02-20 83 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 ....