home *** CD-ROM | disk | FTP | other *** search
/ NVIDIA Tech Demo: DAWN / NVIDIA_demo.iso / Dawn.exe / Disk1 / data1.cab / Program_Executable_Files / shaders_ultra / finalSkinHeadb8bv4m5.vp30 < prev    next >
Encoding:
Text File  |  2003-02-11  |  5.7 KB  |  122 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.worldEyeDir is set to be the eye direction (from eye) in world space
  4. // v2f.worldTanMatrixX is set to be the tangentMatrix X-row in world space
  5. // v2f.worldTanMatrixY is set to be the tangentMatrix Y-row in world space
  6. // v2f.worldTanMatrixZ is set to be the tangentMatrix Z-row in world space
  7. // v2f.SkinSilouetteVec is set to be the skin silouette vector
  8. // InverseTransposes not used, as we assume no nonuniform scales.
  9.  
  10.  
  11. // vecMul(matrix, float3) multiplies like a vector instead of point (no translate)
  12. float3 vecMul(const float4x4 matrix, const float3 vec){
  13.     return(float3(dot(vec, matrix._11_12_13),
  14.                   dot(vec, matrix._21_22_23),
  15.                   dot(vec, matrix._31_32_33)));
  16. }
  17.  
  18. struct a2vConnector : application2vertex {
  19.     float4 coord;
  20.     float4 normal;
  21.     float4 tangent;
  22.     float3 coordMorph0;
  23.     float4 normalMorph0;
  24.     float3 coordMorph1;
  25.     float4 normalMorph1;
  26.     float3 coordMorph2;
  27.     float4 normalMorph2;
  28.     float3 coordMorph3;
  29.     float4 normalMorph3;
  30.     float3 coordMorph4;
  31.     float4 normalMorph4;
  32.     float4 boneWeight0_3;
  33.     float4 boneIndex0_3;
  34.     float4 skinColor_frontSpec;
  35. };
  36.  
  37. struct v2fConnector : vertex2fragment {
  38.   float4 HPOS        :HPOS;
  39.     float4 skinColor_frontSpec    :TEX0;
  40.     float3 worldEyeDir    :TEX2;
  41.     float3 worldTanMatrixX    :TEX5;
  42.     float3 worldTanMatrixY    :TEX6;
  43.     float3 worldTanMatrixZ    :TEX7;
  44.     float4 SkinSilouetteVec    :TEX3;
  45. };
  46.  
  47. v2fConnector main(a2vConnector a2v,
  48.                   const uniform float morphWeight0,
  49.                   const uniform float morphWeight1,
  50.                   const uniform float morphWeight2,
  51.                   const uniform float morphWeight3,
  52.                   const uniform float morphWeight4,
  53.                   const uniform float4x4 model[8],
  54.                   const uniform float4 globalCamPos,
  55.                   const uniform float4x4 view,
  56.                   const uniform float4x4 proj){
  57.     v2fConnector v2f;
  58.  
  59.     v2f.skinColor_frontSpec = a2v.skinColor_frontSpec;
  60.  
  61.     float4 objectCoord = a2v.coord;
  62.     objectCoord.xyz = objectCoord.xyz + morphWeight0 * a2v.coordMorph0;
  63.     objectCoord.xyz = objectCoord.xyz + morphWeight1 * a2v.coordMorph1;
  64.     objectCoord.xyz = objectCoord.xyz + morphWeight2 * a2v.coordMorph2;
  65.     objectCoord.xyz = objectCoord.xyz + morphWeight3 * a2v.coordMorph3;
  66.     objectCoord.xyz = objectCoord.xyz + morphWeight4 * a2v.coordMorph4;
  67.     float4 worldCoord = a2v.boneWeight0_3.x * mul(model[a2v.boneIndex0_3.x], objectCoord);
  68.     worldCoord = worldCoord + a2v.boneWeight0_3.y * mul(model[a2v.boneIndex0_3.y], objectCoord);
  69.     worldCoord = worldCoord + a2v.boneWeight0_3.z * mul(model[a2v.boneIndex0_3.z], objectCoord);
  70.     worldCoord = worldCoord + a2v.boneWeight0_3.w * mul(model[a2v.boneIndex0_3.w], objectCoord);
  71.     float4 worldEyePos = globalCamPos;
  72.     float3 worldEyeDir = normalize(worldCoord.xyz - worldEyePos.xyz);
  73.     v2f.worldEyeDir = worldEyeDir;
  74.  
  75.     float4 objectNormal = a2v.normal;
  76.     objectNormal = objectNormal + morphWeight0 * a2v.normalMorph0;
  77.     objectNormal = objectNormal + morphWeight1 * a2v.normalMorph1;
  78.     objectNormal = objectNormal + morphWeight2 * a2v.normalMorph2;
  79.     objectNormal = objectNormal + morphWeight3 * a2v.normalMorph3;
  80.     objectNormal = objectNormal + morphWeight4 * a2v.normalMorph4;
  81.     objectNormal.xyz = normalize(objectNormal.xyz);
  82.     float3 worldNormal = a2v.boneWeight0_3.x * vecMul(model[a2v.boneIndex0_3.x], objectNormal.xyz);
  83.     worldNormal = worldNormal + a2v.boneWeight0_3.y * vecMul(model[a2v.boneIndex0_3.y], objectNormal.xyz);
  84.     worldNormal = worldNormal + a2v.boneWeight0_3.z * vecMul(model[a2v.boneIndex0_3.z], objectNormal.xyz);
  85.     worldNormal = worldNormal + a2v.boneWeight0_3.w * vecMul(model[a2v.boneIndex0_3.w], objectNormal.xyz);
  86.     worldNormal = normalize(worldNormal);
  87.     float4 objectTangent = a2v.tangent;
  88.     objectTangent.xyz = normalize(objectTangent.xyz - dot(objectTangent.xyz, objectNormal.xyz) * objectNormal.xyz);
  89.     float4 worldTangent;
  90.     worldTangent.xyz = a2v.boneWeight0_3.x * vecMul(model[a2v.boneIndex0_3.x], objectTangent.xyz);
  91.     worldTangent.xyz = worldTangent.xyz + a2v.boneWeight0_3.y * vecMul(model[a2v.boneIndex0_3.y], objectTangent.xyz);
  92.     worldTangent.xyz = worldTangent.xyz + a2v.boneWeight0_3.z * vecMul(model[a2v.boneIndex0_3.z], objectTangent.xyz);
  93.     worldTangent.xyz = worldTangent.xyz + a2v.boneWeight0_3.w * vecMul(model[a2v.boneIndex0_3.w], objectTangent.xyz);
  94.     worldTangent.xyz = normalize(worldTangent.xyz);
  95.     worldTangent.w = objectTangent.w;
  96.     float3 worldBinormal = worldTangent.w * normalize(cross(worldNormal, worldTangent.xyz));
  97.     float3 worldTanMatrixX = float3(worldTangent.x, worldBinormal.x, worldNormal.x);
  98.     v2f.worldTanMatrixX = worldTanMatrixX;
  99.  
  100.     float3 worldTanMatrixY = float3(worldTangent.y, worldBinormal.y, worldNormal.y);
  101.     v2f.worldTanMatrixY = worldTanMatrixY;
  102.  
  103.     float3 worldTanMatrixZ = float3(worldTangent.z, worldBinormal.z, worldNormal.z);
  104.     v2f.worldTanMatrixZ = worldTanMatrixZ;
  105.  
  106.     float4 eyeEyePos = {0.0f, 0.0f, 0.0f, 1.0f};
  107.     float4 eyeCoord = mul(view, worldCoord);
  108.     float3 eyeEyeVec = normalize(eyeEyePos.xyz - eyeCoord.xyz);
  109.     float3 eyeNormal = vecMul(view, worldNormal);
  110.     float VdotN = abs(dot(eyeEyeVec, eyeNormal));
  111.     float oneMinusVdotN = 1.0-VdotN;
  112.     float4 skinSilouetteVec;
  113.     skinSilouetteVec.x = objectNormal.w;
  114.     skinSilouetteVec.y = oneMinusVdotN*oneMinusVdotN;
  115.     skinSilouetteVec.z = oneMinusVdotN;
  116.     v2f.SkinSilouetteVec = skinSilouetteVec;
  117.  
  118.     float4 hpos = mul(proj, eyeCoord);
  119.     v2f.HPOS = hpos;
  120.  
  121.     return v2f;
  122. }