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 / _575A79A667DB4E1686331BC1E75DBB57 < prev    next >
Text File  |  2004-01-22  |  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. #line 1 "ScatterVS10.vsh"
  59. # Scattering Vertex shader
  60. # (c) 2002 Nathaniel Hoffman, Kenneth J. Mitchell and Arcot J. Preetham
  61. #
  62. # V - View direction
  63. # L - Sun direction
  64. # Theta - Scattering angle
  65. # s - Distance
  66. # E - Total extinction (including reflectance).
  67.  
  68. TEMP r0, r1, r2, r3, r4, r5, r6, r7;
  69.  
  70. # Transformation.
  71. DP4     oPos.x, iPos, WORLD_VIEW_PROJECTION[0];
  72. DP4     oPos.y, iPos, WORLD_VIEW_PROJECTION[1];
  73. DP4     oPos.z, iPos, WORLD_VIEW_PROJECTION[2];
  74. DP4     oPos.w, iPos, WORLD_VIEW_PROJECTION[3];
  75.  
  76. # Dot product sun direction with vertex normal
  77. DP3 r0.xyzw, iNormal, SUN_DIRECTION;
  78. # scale by sun color
  79. MUL     r0.xyz, r0, SUN_COLOR;
  80.  
  81. # Sun angle information is in constant 14
  82. # x component is the angle
  83. # y component is the multiplier for the +ve horizon angle (0 or 1)
  84. # z component is the multiplier for the -ve horizon angle (inverse of above)
  85. # Get appropriate horizon information into r0.w
  86.  
  87. MUL     r0.w, iTexCoord0.x, SUN_ANGLE.y;
  88. MUL     r1.w, iTexCoord0.y, SUN_ANGLE.z;
  89. ADD     r1.w, r0.w, r1.w;
  90.  
  91. # Set r0.w if light angle is > horizon angle, otherwise clear it
  92. #sge    r0.w, SUN_ANGLE.x, r1.w
  93.  
  94. # Now calculate the 'shadow intensity'
  95.  
  96. SUB        r1.w, SUN_ANGLE.x, r1.w;    # (light angle - horizon angle)
  97. MUL        r1.w, r1.w, SHADOWSHARPNESS.x; # (Sharpness factor) * (angle delta)
  98. ADD        r1.w, r1.w, ONE.x; # 1 + (5 * angle delta)
  99.  
  100. MAX        r1.w, r1.w, ZERO.x; # Clamp to zero
  101. MIN        r0.w, r1.w, ONE.x; # clamp to one
  102.  
  103. MUL     r0.xyz, r0, r0.w;  # Multiply shadowing result through into output colour
  104. ADD     oT2, r0, AMBIENT;  # Add ambient term
  105.  
  106. # Texture Coordinates.
  107. # 0 - Billboard texture
  108. # 1 - Lightmap texture
  109. MOV     oT0.xy, iTexCoord1;
  110. MOV     oT1.xy, iTexCoord1;
  111.  
  112. MOV     r1.xy, iTexCoord1;
  113. ADD     r1.xy, r1, r1;
  114. ADD     r1.xy, r1, r1;
  115. ADD     r1.xy, r1, r1;
  116. MOV     oT3.xy, r1;
  117.  
  118. DP4     r1.x, iPos, WORLD[0];
  119. DP4     r1.y, iPos, WORLD[1];
  120. DP4     r1.z, iPos, WORLD[2];
  121. DP4     r1.w, iPos, WORLD[3];
  122.  
  123. # Calculate V
  124. SUB     r1, EYE_POSITION, r1;            # V = eye - position
  125. DP3     r1.w, r1, r1;            # Normalize V.
  126. RSQ     r1.w, r1.w;                            
  127. MUL     r1, r1, r1.w;
  128.  
  129. # Angle (theta) between sun direction (L) and view direction (V).
  130. DP3     r0.x, r1, SUN_DIRECTION;       # r0.x = [cos(theta)] = V.L
  131. MAD     r0.y, r0.x, r0.x, CONSTANTS.x;    # r0.y = [1+cos^2(theta)] = Phase1(theta)
  132.  
  133.  
  134. # Distance (s)
  135. DP4     r1.x, iPos, WORLD_VIEW[0]; # r1.z = s
  136. DP4     r1.y, iPos, WORLD_VIEW[1];
  137. DP4     r1.z, iPos, WORLD_VIEW[2];
  138. DP4     r1.w, iPos, WORLD_VIEW[3];
  139. MOV     r0.z, r1.z;                            # store in r0.z for future use.
  140.  
  141. # Terms used in the scattering equation.
  142. # r0 = [cos(theta), 1+cos^2(theta), s] 
  143.  
  144. # Extinction term E
  145. MUL     r1, BETA_1_PLUS_2, -r0.z;       # -(beta_1+beta_2) * s
  146. MUL     r1, r1, CONSTANTS.y;           # -(beta_1+beta_2) * s * log_2 e
  147. EX2     r1.x, r1.x;                    
  148. EX2     r1.y, r1.y;                    
  149. EX2     r1.z, r1.z;                          # r1 = e^(-(beta_1 + beta_2) * s) = E1
  150.  
  151. # Apply Reflectance to E to get total net effective E
  152. MUL     r3, r1, TERRAIN_REFLECTANCE;   #r3 = E (Total extinction) 
  153.  
  154. # Phase2(theta) = (1-g^2)/(1+g-2g*cos(theta))^(3/2)
  155. # theta is 180 - actual theta (this corrects for sign)
  156. # HG = [1-g^2, 1+g, 2g]
  157. MAD     r4.x, HG.z, r0.x, HG.y;# 
  158.  
  159. RSQ     r4.x, r4.x;
  160. MUL     r4.y, r4.x, r4.x;
  161. MUL     r4.x, r4.y, r4.x;
  162. MUL     r0.w, r4.x, HG.x;              # r0.w = Phase2(theta)
  163.  
  164.  
  165. # Inscattering (I) = (Beta'_1 * Phase_1(theta) + Beta'_2 * Phase_2(theta)) * 
  166. #        [1-exp(-Beta_1*s).exp(-Beta_2*s)] / (Beta_1 + Beta_2)
  167.  
  168. MUL     r4, BETA_DASH_1, r0.y;
  169. MUL     r5, BETA_DASH_2, r0.w;
  170. SUB     r6, CONSTANTS.x, r1;
  171. MOV     r7, BETA_1_PLUS_2;
  172.  
  173. ADD     r4, r4, r5;
  174. MUL     r4, r4, r6;
  175. MUL     r4, r4, ONE_OVER_BETA_1_PLUS_2;    # r4 = I (inscattering)
  176.  
  177.  
  178. # Apply Inscattering contribution factors.
  179.  
  180. MUL     r4, r4, TERM_MULTIPLIERS.y;
  181.  
  182. # Scale with Sun color & intesity.
  183. MUL     r4, r4, SUN_COLOR;
  184. MUL     r4, r4, SUN_COLOR.w;
  185.  
  186. MUL     r3, r3, SUN_COLOR;
  187. MUL     r3, r3, SUN_COLOR.w;
  188.  
  189. # Outputs.
  190. MOV     oD0, r3;                             # Extinction
  191. MOV     oD1, r4;                      # Inscattering
  192.  
  193. END
  194.  
  195.