home *** CD-ROM | disk | FTP | other *** search
/ NVIDIA Tech Demo: DAWN / NVIDIA_demo.iso / Dawn.exe / Disk1 / data1.cab / Program_Executable_Files / shaders / finalSkinHeadb8bv4m5.vp30 < prev    next >
Encoding:
Text File  |  2003-02-11  |  5.0 KB  |  108 lines

  1. // v2fConnector.HPOS is set to be the homogenous space coordinate
  2. // v2f.skinColor_frontSpec is set to be the texture coordinate
  3. // v2f.worldNormal is set to be the normal in world space
  4. // v2f.worldReflect is set to be the reflection in world space
  5. // v2f.worldEyeDir is set to be the eye direction (from eye) in world space
  6. // v2f.skinSilouetteVec is set to be the skin silouette vector
  7. // InverseTransposes not used, as we assume no nonuniform scales.
  8.  
  9.  
  10. // vecMul(matrix, float3) multiplies like a vector instead of point (no translate)
  11. float3 vecMul(const float4x4 matrix, const float3 vec){
  12.     return(float3(dot(vec, matrix._11_12_13),
  13.                   dot(vec, matrix._21_22_23),
  14.                   dot(vec, matrix._31_32_33)));
  15. }
  16.  
  17. struct a2vConnector : application2vertex {
  18.     float4 coord;
  19.     float4 normal;
  20.     float3 coordMorph0;
  21.     float4 normalMorph0;
  22.     float3 coordMorph1;
  23.     float4 normalMorph1;
  24.     float3 coordMorph2;
  25.     float4 normalMorph2;
  26.     float3 coordMorph3;
  27.     float4 normalMorph3;
  28.     float3 coordMorph4;
  29.     float4 normalMorph4;
  30.     float4 boneWeight0_3;
  31.     float4 boneIndex0_3;
  32.     float2 skinColor_frontSpec;
  33. };
  34.  
  35. struct v2fConnector : vertex2fragment {
  36.   float4 HPOS        :HPOS;
  37.     float2 skinColor_frontSpec    :TEX0;
  38.     float3 worldNormal    :TEX1;
  39.     float3 worldReflect    :TEX2;
  40.     float3 worldEyeDir    :TEX3;
  41.     float4 skinSilouetteVec    :TEX4;
  42. };
  43.  
  44. v2fConnector main(a2vConnector a2v,
  45.                   const uniform float morphWeight0,
  46.                   const uniform float morphWeight1,
  47.                   const uniform float morphWeight2,
  48.                   const uniform float morphWeight3,
  49.                   const uniform float morphWeight4,
  50.                   const uniform float4x4 model[8],
  51.                   const uniform float4 globalCamPos,
  52.                   const uniform float4x4 viewProj){
  53.     v2fConnector v2f;
  54.  
  55.     v2f.skinColor_frontSpec = a2v.skinColor_frontSpec;
  56.  
  57.     float4 objectNormal = a2v.normal;
  58.     objectNormal = objectNormal + morphWeight0 * a2v.normalMorph0;
  59.     objectNormal = objectNormal + morphWeight1 * a2v.normalMorph1;
  60.     objectNormal = objectNormal + morphWeight2 * a2v.normalMorph2;
  61.     objectNormal = objectNormal + morphWeight3 * a2v.normalMorph3;
  62.     objectNormal = objectNormal + morphWeight4 * a2v.normalMorph4;
  63.     objectNormal = normalize(objectNormal);
  64.     float4x4 worldSkinMatrix;
  65.     worldSkinMatrix[0] = a2v.boneWeight0_3.x * model[a2v.boneIndex0_3.x][0];
  66.     worldSkinMatrix[1] = a2v.boneWeight0_3.x * model[a2v.boneIndex0_3.x][1];
  67.     worldSkinMatrix[2] = a2v.boneWeight0_3.x * model[a2v.boneIndex0_3.x][2];
  68.     worldSkinMatrix[3] = a2v.boneWeight0_3.x * model[a2v.boneIndex0_3.x][3];
  69.     worldSkinMatrix[0] = worldSkinMatrix[0] + a2v.boneWeight0_3.y * model[a2v.boneIndex0_3.y][0];
  70.     worldSkinMatrix[1] = worldSkinMatrix[1] + a2v.boneWeight0_3.y * model[a2v.boneIndex0_3.y][1];
  71.     worldSkinMatrix[2] = worldSkinMatrix[2] + a2v.boneWeight0_3.y * model[a2v.boneIndex0_3.y][2];
  72.     worldSkinMatrix[3] = worldSkinMatrix[3] + a2v.boneWeight0_3.y * model[a2v.boneIndex0_3.y][3];
  73.     worldSkinMatrix[0] = worldSkinMatrix[0] + a2v.boneWeight0_3.z * model[a2v.boneIndex0_3.z][0];
  74.     worldSkinMatrix[1] = worldSkinMatrix[1] + a2v.boneWeight0_3.z * model[a2v.boneIndex0_3.z][1];
  75.     worldSkinMatrix[2] = worldSkinMatrix[2] + a2v.boneWeight0_3.z * model[a2v.boneIndex0_3.z][2];
  76.     worldSkinMatrix[3] = worldSkinMatrix[3] + a2v.boneWeight0_3.z * model[a2v.boneIndex0_3.z][3];
  77.     worldSkinMatrix[0] = worldSkinMatrix[0] + a2v.boneWeight0_3.w * model[a2v.boneIndex0_3.w][0];
  78.     worldSkinMatrix[1] = worldSkinMatrix[1] + a2v.boneWeight0_3.w * model[a2v.boneIndex0_3.w][1];
  79.     worldSkinMatrix[2] = worldSkinMatrix[2] + a2v.boneWeight0_3.w * model[a2v.boneIndex0_3.w][2];
  80.     worldSkinMatrix[3] = worldSkinMatrix[3] + a2v.boneWeight0_3.w * model[a2v.boneIndex0_3.w][3];
  81.     float3 worldNormal = vecMul(worldSkinMatrix, objectNormal);
  82.     worldNormal = normalize(worldNormal);
  83.     v2f.worldNormal = worldNormal;
  84.  
  85.     float4 objectCoord = a2v.coord;
  86.     objectCoord.xyz = objectCoord.xyz + morphWeight0 * a2v.coordMorph0;
  87.     objectCoord.xyz = objectCoord.xyz + morphWeight1 * a2v.coordMorph1;
  88.     objectCoord.xyz = objectCoord.xyz + morphWeight2 * a2v.coordMorph2;
  89.     objectCoord.xyz = objectCoord.xyz + morphWeight3 * a2v.coordMorph3;
  90.     objectCoord.xyz = objectCoord.xyz + morphWeight4 * a2v.coordMorph4;
  91.     float4 worldCoord = mul(worldSkinMatrix, objectCoord);
  92.     float4 worldEyePos = globalCamPos;
  93.     float3 worldEyeDir = normalize(worldCoord.xyz - worldEyePos.xyz);
  94.     float3 worldReflection = reflect(worldEyeDir, worldNormal);
  95.     v2f.worldReflect = worldReflection;
  96.  
  97.     v2f.worldEyeDir = worldEyeDir;
  98.  
  99.     float4 skinSilouetteVec;
  100.     skinSilouetteVec.x = 1.0-dot(worldNormal, -worldEyeDir);
  101.     skinSilouetteVec.y = skinSilouetteVec.x*skinSilouetteVec.x;
  102.     v2f.skinSilouetteVec = skinSilouetteVec;
  103.  
  104.     float4 hpos = mul(viewProj, worldCoord);
  105.     v2f.HPOS = hpos;
  106.  
  107.     return v2f;
  108. }