home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2006 January / Gamestar_80_2006-01_dvd.iso / Utility / 5-11_xp-2k_dd_ccc_wdm_enu_27345.exe / Data1.cab / _7B146224EFB94D9183D641EF32ACE2D7 < prev    next >
Text File  |  2004-03-29  |  6KB  |  197 lines

  1. !!ARBvp1.0
  2. # road vertex shader
  3. PARAM WORLD_VIEW_PROJECTION[4] = { program.env[0..3] };
  4. PARAM WORLD_VIEW[4] = { program.env[4..7] };
  5. PARAM WORLD[4] = { program.env[8..11] };
  6.  
  7. PARAM SUN_DIRECTION = program.env[12];            #(.w = intensity)        
  8. PARAM SUN_ANGLE = program.env[14];
  9. PARAM SUN_COLOR = program.env[15];
  10. PARAM TERRAIN_REFLECTANCE = program.env[13];
  11.  
  12. PARAM BETA_1 = program.env[30];
  13. PARAM BETA_2 = program.env[29];
  14. PARAM BETA_DASH_1 = program.env[27];
  15. PARAM BETA_DASH_2 = program.env[26];
  16. PARAM BETA_1_PLUS_2 = program.env[24];
  17. PARAM ONE_OVER_BETA_1_PLUS_2 = program.env[23];
  18.  
  19. PARAM HG = program.env[28];        # = 1-g^2, 1+g, 2g, 0
  20. PARAM CONSTANTS = program.env[31];        # = 1.0, log_2 e, 0.5, 0
  21. PARAM TERM_MULTIPLIERS = program.env[25];        # = frac_ext, frac_ins.
  22.  
  23. PARAM ZERO = program.env[20];
  24. PARAM ONE = program.env[21];
  25. PARAM SHADOWSHARPNESS = program.env[32];
  26. PARAM AMBIENT = program.env[33];      # Ambient term to add to the rendering
  27. PARAM INSCATTERINGMULTIPLIER = program.env[34];      # Term to attenuate the inscattering
  28.  
  29. PARAM BASE_TEX_PROJECTION = program.env[16];
  30. PARAM DETAIL_TEX_PROJECTION = program.env[17];
  31. PARAM CLOUD_TEX_PROJECTION_0 = program.env[18];
  32. PARAM CLOUD_TEX_PROJECTION_1 = program.env[19];
  33.  
  34. PARAM EYE_POSITION = program.env[22];
  35.  
  36. PARAM SPECULAR_POWER = program.env[35];
  37. PARAM DIFFUSE_COLOUR = program.env[36];
  38. PARAM SPECULAR_COLOUR = program.env[37];
  39.  
  40. PARAM CARCOLOR0 = program.env[38];
  41. PARAM CARCOLOR1 = program.env[39];
  42. PARAM CARCOLOR2 = program.env[40];
  43.  
  44. ATTRIB iPos = vertex.position;
  45. ATTRIB iNormal = vertex.normal;
  46. ATTRIB iTexCoord0 = vertex.texcoord[0];
  47. ATTRIB iTexCoord1 = vertex.texcoord[1];
  48. ATTRIB iTexCoord2 = vertex.texcoord[2];
  49.  
  50. OUTPUT oPos = result.position;
  51. OUTPUT oD0 = result.color.primary;
  52. OUTPUT oD1 = result.color.secondary;
  53. OUTPUT oT0 = result.texcoord[0];
  54. OUTPUT oT1 = result.texcoord[1];
  55. OUTPUT oT2 = result.texcoord[2];
  56. OUTPUT oT3 = result.texcoord[3];
  57.  
  58. # V - View direction
  59. # L - Sun direction
  60. # Theta - Scattering angle
  61. # s - Distance
  62. # E - Total extinction (including reflectance).
  63.  
  64. TEMP r0, r1, r2, r3, r4, r5, r6, r7;
  65.  
  66. # Transformation.
  67. DP4     oPos.x, iPos, WORLD_VIEW_PROJECTION[0];
  68. DP4     oPos.y, iPos, WORLD_VIEW_PROJECTION[1];
  69. DP4     oPos.z, iPos, WORLD_VIEW_PROJECTION[2];
  70. DP4     oPos.w, iPos, WORLD_VIEW_PROJECTION[3];
  71.  
  72. # Dot product sun direction with vertex normal
  73. DP3 r0.xyzw, iNormal, SUN_DIRECTION;
  74. # scale by sun color
  75. MUL     r0.xyz, r0, SUN_COLOR;
  76.  
  77. # scale by sun and car color and output to diffuse
  78. MUL     r1.xyz, r0, SUN_COLOR;
  79. MUL     oD0, r1, DIFFUSE_COLOUR;
  80.  
  81. DP4     r1.x, iPos, WORLD[0];
  82. DP4     r1.y, iPos, WORLD[1];
  83. DP4     r1.z, iPos, WORLD[2];
  84. DP4     r1.w, iPos, WORLD[3];
  85.  
  86. # Calculate V
  87. SUB     r1, EYE_POSITION, r1;            # V = eye - position
  88. DP3     r1.w, r1, r1;            # Normalize V.
  89. RSQ     r1.w, r1.w;                            
  90. MUL     r1, r1, r1.w;
  91.  
  92. # Calculate specular
  93. # transform Normal to view space and renormalise
  94. DP3     r2.x, iNormal, WORLD[0];
  95. DP3     r2.y, iNormal, WORLD[1];
  96. DP3     r2.z, iNormal, WORLD[2];
  97. DP3        r3, r2, r2;
  98. RSQ        r3.x, r3.x;
  99. MUL        r2, r2, r3.x;
  100.  
  101. # N.L
  102. DP3        r3, r2, SUN_DIRECTION;
  103. # (N.L) * N
  104. MUL        r4, r3, r2;
  105. # (2* (N.L) * N)
  106. ADD        r4, r4, r4;
  107. #( 2 * (N.L) * N) - L
  108. SUB        r4, r4, SUN_DIRECTION;
  109. # Renormalise
  110. DP3        r3, r4, r4;
  111. RSQ        r3.x, r3.x;
  112. # R = Normalise(2*dot(N,L)*N-L)
  113. MUL        r4, r4, r3.x;
  114.  
  115. #dot(R,V)
  116. DP3        r2, r1, r4;
  117. #max(0,dot(R,V))
  118. MAX        r2, r2, CONSTANTS.wwww;
  119.  
  120. # Evaluate specular
  121. MOV     r3.x, r0.x;
  122. MOV     r3.y, r2.x;
  123. MOV     r3.w, SPECULAR_POWER.x;
  124. LIT     r2, r3;
  125.  
  126. # Scale by sun colour
  127. MUL        r2, r2.zzzz, SUN_COLOR;
  128.  
  129. # Scale by material specular and output
  130. MUL     oD1, r2, SPECULAR_COLOUR;  # Specular
  131.  
  132.  
  133. # Angle (theta) between sun direction (L) and view direction (V).
  134. DP3     r0.x, r1, SUN_DIRECTION;       # r0.x = [cos(theta)] = V.L
  135. MAD     r0.y, r0.x, r0.x, CONSTANTS.x;    # r0.y = [1+cos^2(theta)] = Phase1(theta)
  136.  
  137. # Distance (s)
  138. DP4     r1.x, iPos, WORLD[0];
  139. DP4     r1.y, iPos, WORLD[1];
  140. DP4     r1.z, iPos, WORLD[2];
  141. DP4     r1.w, iPos, WORLD[3];
  142. MOV     r0.z, r1.z;            # store in r0.z for future use.
  143.  
  144. # Terms used in the scattering equation.
  145. # r0 = [cos(theta), 1+cos^2(theta), s] 
  146.  
  147. # Extinction term E
  148. MUL     r1, BETA_1_PLUS_2, -r0.z;       # -(beta_1+beta_2) * s
  149. MUL     r1, r1, CONSTANTS.y;           # -(beta_1+beta_2) * s * log_2 e
  150. EX2     r1.x, r1.x;                    
  151. EX2     r1.y, r1.y;                    
  152. EX2     r1.z, r1.z;                          # r1 = e^(-(beta_1 + beta_2) * s) = E1
  153.  
  154. # Apply Reflectance to E to get total net effective E
  155. MUL     r3, r1, TERRAIN_REFLECTANCE;   #r3 = E (Total extinction) 
  156.  
  157. # Phase2(theta) = (1-g^2)/(1+g-2g*cos(theta))^(3/2)
  158. # theta is 180 - actual theta (this corrects for sign)
  159. # c[28] = [1-g^2, 1+g, 2g]
  160. MAD     r4.x, HG.z, r0.x, HG.y;
  161.  
  162. RSQ     r4.x, r4.x;
  163. MUL     r4.y, r4.x, r4.x;
  164. MUL     r4.x, r4.y, r4.x;
  165. MUL     r0.w, r4.x, HG.x;              # r0.w = Phase2(theta)
  166.  
  167. # Inscattering (I) = (Beta'_1 * Phase_1(theta) + Beta'_2 * Phase_2(theta)) * 
  168. #        [1-exp(-Beta_1*s).exp(-Beta_2*s)] / (Beta_1 + Beta_2)
  169.  
  170. MUL     r4, BETA_DASH_1, r0.y;
  171. MUL     r5, BETA_DASH_2, r0.w;
  172. SUB     r6, CONSTANTS.x, r1;
  173. MOV     r7, BETA_1_PLUS_2;
  174.  
  175. ADD     r4, r4, r5;
  176. MUL     r4, r4, r6;
  177. MUL     r4, r4, ONE_OVER_BETA_1_PLUS_2;    # r4 = I (inscattering)
  178.  
  179.  
  180. # Apply Inscattering contribution factors.
  181.  
  182. MUL     r4, r4, TERM_MULTIPLIERS.y;
  183.  
  184. # Scale with Sun color & intesity.
  185. MUL     r4, r4, SUN_COLOR;
  186. MUL     r4, r4, SUN_COLOR.w;
  187.  
  188. MUL     r3, r3, SUN_COLOR;
  189. MUL     r3, r3, SUN_COLOR.w;
  190.  
  191. # Outputs.
  192. MOV     oT0, r3;                             # Extinction
  193. ADD     oT1, r4, AMBIENT;                      # Inscattering + Ambient term
  194. MOV     oT2, iTexCoord0;
  195. END
  196.