【发布时间】:2013-02-22 06:30:04
【问题描述】:
所以,好的。我正在尝试在我的小型游戏引擎中实现法线映射,但我无法让它工作。
当我只使用每个顶点法线进行照明时,一切都很好,但如果我尝试使用法线贴图进行照明,那么一切都会崩溃。
我知道我有正确的 UV,因为纹理看起来不错,但我不知道在法线贴图纹理方面我做错了什么。
这是我的像素着色器(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)而不是对纹理进行采样,会发生什么情况?
-
好的,我实际上是在使用不同的照明模型来实现我的照明,并将对此进行更新。我认为我现在做错的是我没有正确地在切线空间、世界空间和模型空间之间转换向量。
标签: graphics 3d hlsl directx-11