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

  1. // v2fConnector.HPOS is set to be the homogenous space coordinate
  2. // v2f.worldTangent is set to be the tangent in world space
  3. // InverseTransposes not used, as we assume no nonuniform scales.
  4.  
  5. // vecMul(matrix, float3) multiplies like a vector instead of point (no translate)
  6. float3 vecMul(const float4x4 matrix, const float3 vec){
  7.     return(float3(dot(vec, matrix._11_12_13),
  8.                   dot(vec, matrix._21_22_23),
  9.                   dot(vec, matrix._31_32_33)));
  10. }
  11.  
  12. struct a2vConnector : application2vertex {
  13.     float4 coord;
  14.     float3 tangent;
  15.     float4 normal;
  16.     float3 color;
  17. };
  18.  
  19. struct v2fConnector : vertex2fragment {
  20.   float4 HPOS           :HPOS;
  21.   float3 silhouette     :TEX0;
  22.   float4 worldEyeDir    :TEX1;
  23.   float4 texCoord       :TEX2;
  24.   //float3 fakeNorm       :TEX3;
  25. };
  26.  
  27. v2fConnector main(a2vConnector a2v,
  28.                   const uniform float4x4 model,
  29.                   const uniform float4x4 viewInv, 
  30.                   const uniform float4x4 viewProj, 
  31.                   const uniform float4x4 modelViewProj,
  32.           const uniform float4 hairThikness){
  33.     v2fConnector v2f;
  34.  
  35.     float3 worldTangent = vecMul(model, a2v.tangent);
  36.  
  37.     float4 objectCoord = float4(a2v.coord.x, a2v.coord.y, a2v.coord.z, 1);
  38.  
  39.     float3 worldPos = vecMul(model, objectCoord.xyz);
  40.     float3 worldEyePos = viewInv._14_24_34;
  41.  
  42.     v2f.worldEyeDir.xyz = normalize(worldEyePos - worldPos.xyz);
  43.     float s = 0.5*dot(worldTangent.xyz, v2f.worldEyeDir.xyz);    
  44.     float t  = s + 1;
  45.     s  = -s + 1;
  46.  
  47.     v2f.texCoord = float4(s, t, a2v.color.x, a2v.color.y);    
  48.  
  49.     float4 worldPos1 = mul(model, objectCoord);
  50.     v2f.worldEyeDir.xyz = normalize(worldPos1.xyz - worldEyePos);
  51.  
  52.     //float3 binormal = cross(v2f.worldEyeDir.xyz, worldTangent.xyz);
  53.  
  54.     //worldPos1.xyz = worldPos1.xyz + a2v.coord.w*binormal*hairThikness.x;
  55.     //float4 hpos = mul(viewProj, worldPos1);
  56.  
  57.     float3 worldNorm = vecMul(model, a2v.normal.xyz);
  58.  
  59.     float facingRatio = 1-max(dot(worldNorm.xyz, -v2f.worldEyeDir.xyz), 0.001);
  60.  
  61.     facingRatio = facingRatio*facingRatio;
  62.     v2f.silhouette.xyz = facingRatio*facingRatio;
  63.  
  64.     float4 hpos = mul(modelViewProj, objectCoord);    
  65.     
  66.     v2f.HPOS = hpos;
  67.  
  68.     return v2f;
  69. }
  70.  
  71.  
  72.