Graphics 实现法线映射HLSL

Graphics 实现法线映射HLSL,graphics,3d,hlsl,directx-11,Graphics,3d,Hlsl,Directx 11,所以,好吧。我试图在我的小游戏引擎中实现法线映射,但我就是无法让它工作 当我只使用逐顶点法线进行照明时,一切都很好,但如果我尝试使用法线贴图进行照明,那么一切都会崩溃 我知道我有正确的UV,因为纹理看起来不错,但我不知道在法线贴图纹理方面我做错了什么 这是我的像素着色器(HLSL)中的一些代码 你知道我做错了什么吗?好的,我把它修好了。我只是在错误的坐标空间里做正常的计算。为了使它更容易,我决定在模型空间中做所有的事情。看起来很棒。很遗憾我不能发布屏幕截图 再次感谢Miloszmaki….代码看

所以,好吧。我试图在我的小游戏引擎中实现法线映射,但我就是无法让它工作

当我只使用逐顶点法线进行照明时,一切都很好,但如果我尝试使用法线贴图进行照明,那么一切都会崩溃

我知道我有正确的UV,因为纹理看起来不错,但我不知道在法线贴图纹理方面我做错了什么

这是我的像素着色器(HLSL)中的一些代码


你知道我做错了什么吗?

好的,我把它修好了。我只是在错误的坐标空间里做正常的计算。为了使它更容易,我决定在模型空间中做所有的事情。看起来很棒。很遗憾我不能发布屏幕截图


再次感谢Miloszmaki….

代码看起来不错。确保正确计算法线和切线。还要记住,NormalSample在世界空间中返回法线,因此您应该在世界空间中进行照明。如果将normalMapSample设置为固定值(0.5,0.5,1)而不是对纹理进行采样,会发生什么情况?好的,我实际上是使用不同的照明模型实现照明,并将对此进行更新。我认为我现在做错的是,我没有正确地在切线空间、世界空间和模型空间之间转换向量。
    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;
}