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 / _D8A7AB0BAB88421199172A71EB34E128 < prev    next >
Text File  |  2004-01-22  |  6KB  |  188 lines

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