【发布时间】:2016-01-29 02:35:34
【问题描述】:
我的法线贴图有问题,我被困在哪里出错了。地图似乎在模型上,但不在正确的空间中。可变眼睛只是相机位置。切线是在程序中计算出来的,而且是正确的。
顶点着色器:
void main()
{
vec3 EyeSpaceNormal = normalize(vec3(NormalMatrix * VertexNormal));
vec3 EyeSpaceTangent = normalize(vec3(NormalMatrix * vec3(VertexTangent)));
TexCoord = VertexUV;
vec3 bitangent = normalize(cross( EyeSpaceNormal, EyeSpaceTangent)) * VertexTangent.w;
mat3 TBN = mat3(EyeSpaceTangent, bitangent, EyeSpaceNormal);
TangentLightDirection = vec3( normalize(LightDirection) * TBN );
TangentEye = vec3(normalize( eye) * TBN );
Normal = EyeSpaceNormal;
VertPosition = vec3( ModelViewMatrix * vec4(VertexPosition,1.0));
gl_Position = MVP * vec4(VertexPosition,1.0);
}
片段着色器:
void main()
{
vec3 ReturnColour;
vec3 TextureNormal_tangentspace = normalize(texture2D( NormalMap, TexCoord ).rgb * 2.0 - 1.0);
vec3 diffuse = intensity * vec3(0.0,1.0,0.0) * max(0,dot(normalize(TextureNormal_tangentspace), normalize(-TangentLightDirection)));
vec3 specular;
//Specular
vec3 VertexToEye = normalize(TangentEye - VertPosition);
vec3 LightReflect = normalize(reflect(normalize(TangentLightDirection), TextureNormal_tangentspace));
float SpecularFactor = dot(VertexToEye, LightReflect);
SpecularFactor = pow(SpecularFactor, Shininess);
if(SpecularFactor > 0)
{
specular = intensity * vec3(0.0,1.0,0.0) * SpecularFactor;
}
ReturnColour = diffuse + specular;
FragColor = vec4(ReturnColour, 1.0);
}
【问题讨论】:
-
您没有详细说明结果与您的预期有何不同。我看到的一个问题是您应该在
pow()调用之前检查SpecularFactor是否是肯定的。否则pow()的结果是未定义的。