Sign in to follow this  

Calculating Tangent Space

This topic is 4284 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi, I'm trying to add bumpmapping to my deferred shading engine and im having trouble calculating the per-vertex tangents to pass into it. I have adapted the code from here but it doesnt always work, when ever the vertex has a normal with a negative value, the tangent isnt calculated. Could someone explain to me (in simple terms) why this is happening? Here is my code in case it helps:
void KMesh::CalculatePerVertexTangents()
{
	KPolygon* ptr = polygons;
	tangents = new KVec3[numVertices];

    KVec3 *tan1 = new KVec3[numVertices];
    
    memset(tan1, 0, sizeof(KVec3) * numVertices);

	for (int i = 0; i < numPolygons; i++)
	{
		int numTris = ptr->GetNumTriangles();
		for (int j = 0; j < numTris; j++)
		{
			int idx[3];
			ptr->GetTriangle(j, idx[0], idx[1], idx[2]);

			KVec3 v1 = vertices[idx[0]];
			KVec3 v2 = vertices[idx[1]];
			KVec3 v3 = vertices[idx[2]];

			KVec2 w1 = texCoords[idx[0]];
			KVec2 w2 = texCoords[idx[1]];
			KVec2 w3 = texCoords[idx[2]];

			float x1 = v2.X() - v1.X();
			float x2 = v3.X() - v1.X();
			float y1 = v2.Y() - v1.Y();
			float y2 = v3.Y() - v1.Y();
			float z1 = v2.Z() - v1.Z();
			float z2 = v3.Z() - v1.Z();
	        
			float s1 = w2.X() - w1.X();
			float s2 = w3.X() - w1.X();
			float t1 = w2.Y() - w1.Y();
			float t2 = w3.Y() - w1.Y();

			float r = 1.0F / (s1 * t2 - s2 * t1);
			KVec3 sdir((t2 * x1 - t1 * x2) * r, (t2 * y1 - t1 * y2) * r,
					(t2 * z1 - t1 * z2) * r);

			tan1[idx[0]] += sdir;
			tan1[idx[1]] += sdir;
			tan1[idx[2]] += sdir;
		}
	}

	KVec3 n, t;

	for (int a = 0; a < numVertices; a++)
	{
		n = normals[a];
        t = tan1[a];
        
        // Gram-Schmidt orthogonalize
		tangents[a] = (t - (n * n.Dot(t))).Normalise();
	}

	delete [] tan1;
}

Thanks, Luke.

Share this post


Link to post
Share on other sites
Your code looks correct to me. It should work fine as long as your input data doesn't include triangles with degenerate texture mapping or left-handed texture spaces (since you removed the handedness calculation). I'm not sure what you mean by a tangent not being calculated when the normal has a negative value.

Share this post


Link to post
Share on other sites

This topic is 4284 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this