struct appdata {
   float3 position  : POSITION;
   float3 normale   : NORMAL;
   float2 texcoord0 : TEXCOORD0;
};

struct Vert
{
   float4 position  : POSITION;
   float3 texcoord0 : TEXCOORD0;

   float2 texcoord1 : TEXCOORD1;
   float2 texcoord2 : TEXCOORD2;
   float2 texcoord3 : TEXCOORD3;
};

void computeProjectiveCoords( out float2 c, float4 pS, float4x4 camMat )
{
   float4 pE;
   pE = mul( camMat, pS );
   pE /= pE.w;
   c = pE.xy;
}

Vert main( appdata I,
      const uniform float4x4  mat  : register(c0),
      const uniform float4x4  mat0 : register(c4),
      const uniform float4x4  mat1 : register(c8),
      const uniform float4x4  mat2 : register(c12)
      )
{
   Vert O;

   float4 p_cam_space,
          pS;

   pS = float4( I.position.x, I.position.y, I.position.z, 1.0 );

   p_cam_space = mul( mat, pS );

   computeProjectiveCoords( O.texcoord1, pS, mat0 );
   computeProjectiveCoords( O.texcoord2, pS, mat1 );
   computeProjectiveCoords( O.texcoord3, pS, mat2 );

   O.texcoord0 = I.position;
   O.position  = p_cam_space;

   return O;
}