所以,我在世界空间中有一个光方向,我计算每个顶点的法线...但是我对我的法线贴图实现有点困惑。现在我正在这样做。
// Normal Map
const float3 normalmap = (2.0f*gTextures1024.Sample(gLinearSam, float3(_in.Tex, gNormalMapIndex)).rgb) - 1.0f;
const float3 NormalW = _in.Norm;
const float3 TangentW = normalize(_in.TangentW.xyz - dot(_in.TangentW.xyz, _in.Norm)* _in.Norm);
const float3 BitangentW = cross(NormalW, TangentW) * _in.TangentW.w;
const float3x3 TBN = float3x3(TangentW, BitangentW, NormalW);
float3 normal = normalize(mul(TBN, normalmap));
// Lighting Calculations
//float4 normal = normalize(float4(_in.Norm, 0.0f));
float3 hvector = normalize(mul(-gDirLight.Direction.xyz, TBN) + gEyePos).xyz;
//hvector = mul(hvector.xyz, TBN);
float4 ambient = gDirLight.Ambient * gMaterial.Ambient;
float4 diffuse = float4(0.0f, 0.0f, 0.0f, 0.0f);
float4 specular = float4(0.0f, 0.0f, 0.0f, 0.0f);
float4 texColor = float4(1.0f, 1.0f, 1.0f, 1.0f);
[branch]
if(gUseTextures)
texColor = gTextures1024.Sample(gLinearSam, float3(_in.Tex, gDiffuseMapIndex));
// diffuse factor
float diffuseFactor = saturate(dot(normal, -gDirLight.Direction.xyz));
[branch]
if(diffuseFactor > 0.0f)
{
diffuse = diffuseFactor * gDirLight.Diffuse * gMaterial.Diffuse;
// Specular facttor & color
float HdotN = saturate(dot(hvector, normal));
specular = gDirLight.Specular * pow(HdotN, gMaterial.Specular.w);
}
// Modulate with late add
return (texColor * (ambient + diffuse)) + specular;
我在这里做错了吗?据我说,我正在世界空间实施法线贴图计算,一切都应该正常工作......我在这里遗漏了什么吗?
答案 0 :(得分:2)
TBN
是一个矩阵,可以将矢量从世界空间转换为切线空间。因此,您应该在切线空间中进行光照计算。
从法线贴图中获取的法线已经在切线空间中(可能)。因此,您需要将光线方向和眼睛位置转换为切线空间,并照常继续计算。
答案 1 :(得分:0)
问题#1:我没有正确计算我的法线。我正在使用每顶点平均值,但甚至不知道有加权平均这样的技术。我的所有灯光都提高了2000%。
问题#2:Tangent和Bitangent计算也没有正确完成。我仍然可以在该领域进行改进,看看我是否也可以对它们进行加权平均。
问题#3:我没有正确地进行光照计算,在维基百科上工作了大约2天后,我终于做到了,并且现在完全清楚了解它。
问题#4:我只是想快点做而不理解我正在做的事情(从未犯过这样的错误)。