Ive got this normal map:
And, well, something isnt quite right:
Here is my tangent generation:
void CalculateTangents() {
tangents.clear();
for (int i = 0; i < vertices.size(); i += 3) {
glm::vec3 edge1 = vertices[i + 1] - vertices[i];
glm::vec3 edge2 = vertices[i + 2] - vertices[i];
glm::vec2 deltaUV1 = uvs[i + 1] - uvs[i];
glm::vec2 deltaUV2 = uvs[i + 2] - uvs[i];
GLfloat f = 1.0f / (deltaUV1.x * deltaUV2.y - deltaUV2.x * deltaUV1.y);
glm::vec3 tangent;
tangent.x = f * (deltaUV2.y * edge1.x - deltaUV1.y * edge2.x);
tangent.y = f * (deltaUV2.y * edge1.y - deltaUV1.y * edge2.y);
tangent.z = f * (deltaUV2.y * edge1.z - deltaUV1.y * edge2.z);
tangent = glm::normalize(tangent);
tangents.push_back(tangent);
tangents.push_back(tangent);
tangents.push_back(tangent);
}
}
... My Vertex shader...:
vec3 T = normalize(vec3(transform * vec4(tangent, 0.0)));
vec3 N = normalize(vec3(transform * vec4(normal, 0.0)));
T = normalize(T - dot(T, N) * N);
vec3 B = cross(T, N);
vs_out.TBN = mat3(T, B, N);
... And my Fragment shader:
gNormal.xyz = normalize(fs_in.TBN * (texture(normal, fs_in.uv).rgb * 2.0 - 1.0));
The normals _should_ be in world space, so i cant quite find what's wrong.