Is Tan1 and Tan2, sTangent and tTangent? If so the following should be correct:
Code: Procedure BuildMD5Tangents(var Mesh : TMD5Mesh); var x,v1,v2,v3 : Integer; x1,x2,y1,y2,z1,z2, s1,s2,t1,t2, r : Single; sdir,tdir : TVector3f; begin for x := 0 to Mesh.Header.NumTris-1 do begin v1 := Mesh.Tris[x].V1; v2 := Mesh.Tris[x].V2; v3 := Mesh.Tris[x].V3; x1 := Mesh.Verts[v2].Position.X - Mesh.Verts[v1].Position.X; x2 := Mesh.Verts[v3].Position.X - Mesh.Verts[v1].Position.X; y1 := Mesh.Verts[v2].Position.Y - Mesh.Verts[v1].Position.Y; y2 := Mesh.Verts[v3].Position.Y - Mesh.Verts[v1].Position.Y; z1 := Mesh.Verts[v2].Position.Z - Mesh.Verts[v1].Position.Z; z2 := Mesh.Verts[v3].Position.Z - Mesh.Verts[v1].Position.Z; s1 := Mesh.Verts[v2].s - Mesh.Verts[v1].s; s2 := Mesh.Verts[v3].s - Mesh.Verts[v1].s; t1 := Mesh.Verts[v2].t - Mesh.Verts[v1].t; t2 := Mesh.Verts[v3].t - Mesh.Verts[v1].t; r := 1 / (s1 * t2 - s2 * t1); sdir := SetVector((s1 * x2 - s2 * x1) * r, (s1 * y2 - s2 * y1) * r,(s1 * z2 - s2 * z1) * r); tdir := SetVector((t2 * x1 - t1 * x2) * r, (t2 * y1 - t1 * y2) * r,(t2 * z1 - t1 * z2) * r); Mesh.Verts[v1].sTangent := AddVector(Mesh.Verts[v1].sTangent,sdir); Mesh.Verts[v1].tTangent := AddVector(Mesh.Verts[v1].tTangent,tdir); Mesh.Verts[v2].sTangent := AddVector(Mesh.Verts[v2].sTangent,sdir); Mesh.Verts[v2].tTangent := AddVector(Mesh.Verts[v2].tTangent,tdir); Mesh.Verts[v3].sTangent := AddVector(Mesh.Verts[v3].sTangent,sdir); Mesh.Verts[v3].tTangent := AddVector(Mesh.Verts[v3].tTangent,tdir); end; end;
EDIT:
Render Code(Modifyed Bumpmap v2 demo code):
Code: If Shader.BumpMapID > 0 then begin glBindProgramARB(GL_VERTEX_PROGRAM_ARB, BumpVP); glEnable(GL_VERTEX_PROGRAM_ARB); glProgramLocalParameter4fARB(GL_VERTEX_PROGRAM_ARB, 0, 0,0,0,0); glProgramLocalParameter4fARB(GL_VERTEX_PROGRAM_ARB, 1, 0,10,10,0); glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, BumpFP); glEnable(GL_FRAGMENT_PROGRAM_ARB); glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 0, 1/50,1/50,1/50,1/50); // invRadius glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 1, 0,0,0,0); // ambient // Bind base map to texture unit 0 glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, Shader.DiffuseMapID); glEnable(GL_TEXTURE_2D); // Bind normal map to texture unit 1 glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, Shader.BumpMapID); glEnable(GL_TEXTURE_2D); // Bind specular map to texture unit 2 glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, Shader.SpecularMapID); glEnable(GL_TEXTURE_2D); glClientActiveTexture(GL_TEXTURE0); glDisable(GL_CULL_FACE); glBegin(GL_TRIANGLES); For v := 0 to Vertex_No-1 do begin glActiveTexture(GL_TEXTURE0); glTexCoord2f(Vertexs[v].TextureCoord.X,Vertexs[v].TextureCoord.Y); glActiveTexture(GL_TEXTURE1); SpaceLight := GetSpaceLight(SetVector(0,0,0),sTan[v],tTan[v],Vertexs[v].Normal); glTexCoord3f(SpaceLight.X,SpaceLight.Y,SpaceLight.Z); glVertex3f(Vertexs[v].Position.X,Vertexs[v].Position.Y,Vertexs[v].Position.Z); end; glend; // Disable textures glActiveTexture(GL_TEXTURE1); glDisable(GL_TEXTURE_2D); glActiveTexture(GL_TEXTURE2); glDisable(GL_TEXTURE_2D); glActiveTexture(GL_TEXTURE0); //glDisable(GL_TEXTURE_2D); glDisable(GL_VERTEX_PROGRAM_ARB); glDisable(GL_FRAGMENT_PROGRAM_ARB); exit; end;
Code: Function GetSpaceLight(Light,sTan,tTan,Normal : TVector3f) : TVector3f; begin Result.X := DotProduct(sTan,light); Result.Y := DotProduct(tTan,light); Result.Z := DotProduct(Normal,light); end;
Models are just black....
|