// Bump Mapping FX // [ArbVpTechnique, pass 1] // // Profile: ARBVP1 // Options: position invariant // Copyright 2003 by Marco Jez struct Vertex_data { float4 Position : POSITION; // vertex position float4 Normal : NORMAL; // vertex normal float2 TexCoordC : TEXCOORD1; // color map texture coordinates float2 TexCoordN : TEXCOORD0; // normal map texture coordinates float3 T : ATTR3; // tangent vector float3 B : ATTR4; // binormal vector float3 N : ATTR5; // normal vector }; struct Fragment_data { float4 Position : POSITION; // homogeneous position float4 LightVector : COLOR0; // light vector in tangent space float2 TexCoordC : TEXCOORD1; // color map texture coordinates float2 TexCoordN : TEXCOORD0; // normal map texture coordinates }; Fragment_data main(Vertex_data input) { float4x4 orig_MV = glstate.matrix.modelview[0]; float3x3 MV; MV[0] = (float3)orig_MV[0]; MV[1] = (float3)orig_MV[1]; MV[2] = (float3)orig_MV[2]; Fragment_data output; // pass texture coordinates for fetching the color map output.TexCoordC = input.TexCoordC; // pass texture coordinates for fetching the normal map output.TexCoordN = input.TexCoordN; // compute the 3x3 tranform from eye space to tangent space float3x3 eyeToTangentSpace; eyeToTangentSpace[0] = mul(MV, input.T); eyeToTangentSpace[1] = mul(MV, input.B); eyeToTangentSpace[2] = mul(MV, input.N); // transform light vector from eye space to tangent space and pass it as a color output.LightVector.xyz = 0.5 * mul(eyeToTangentSpace, normalize(glstate.light[0].position.xyz)) + 0.5.xxx; output.LightVector.w = 1; // transform position to projection space output.Position = mul(glstate.matrix.mvp, input.Position); return output; }