!!ARBvp1.0 PARAM WORLD_VIEW_PROJECTION[4] = { program.env[0..3] }; PARAM WORLD_VIEW[4] = { program.env[4..7] }; PARAM WORLD[4] = { program.env[8..11] }; PARAM SUN_DIRECTION = program.env[12]; #(.w = intensity) PARAM SUN_ANGLE = program.env[14]; PARAM SUN_COLOR = program.env[15]; PARAM TERRAIN_REFLECTANCE = program.env[13]; PARAM BETA_1 = program.env[30]; PARAM BETA_2 = program.env[29]; PARAM BETA_DASH_1 = program.env[27]; PARAM BETA_DASH_2 = program.env[26]; PARAM BETA_1_PLUS_2 = program.env[24]; PARAM ONE_OVER_BETA_1_PLUS_2 = program.env[23]; PARAM HG = program.env[28]; # = 1-g^2, 1+g, 2g, 0 PARAM CONSTANTS = program.env[31]; # = 1.0, log_2 e, 0.5, 0 PARAM TERM_MULTIPLIERS = program.env[25]; # = frac_ext, frac_ins. PARAM ZERO = program.env[20]; PARAM ONE = program.env[21]; PARAM SHADOWSHARPNESS = program.env[32]; PARAM AMBIENT = program.env[33]; # Ambient term to add to the rendering PARAM INSCATTERINGMULTIPLIER = program.env[34]; # Term to attenuate the inscattering PARAM BASE_TEX_PROJECTION = program.env[16]; PARAM DETAIL_TEX_PROJECTION = program.env[17]; PARAM CLOUD_TEX_PROJECTION_0 = program.env[18]; PARAM CLOUD_TEX_PROJECTION_1 = program.env[19]; PARAM EYE_POSITION = program.env[22]; PARAM SPECULAR_POWER = program.env[35]; PARAM DIFFUSE_COLOUR = program.env[36]; PARAM SPECULAR_COLOUR = program.env[37]; PARAM CARCOLOR0 = program.env[38]; PARAM CARCOLOR1 = program.env[39]; PARAM CARCOLOR2 = program.env[40]; ATTRIB iPos = vertex.position; ATTRIB iNormal = vertex.normal; ATTRIB iTexCoord0 = vertex.texcoord[0]; ATTRIB iTexCoord1 = vertex.texcoord[1]; OUTPUT oPos = result.position; OUTPUT oD0 = result.color.primary; OUTPUT oD1 = result.color.secondary; OUTPUT oT0 = result.texcoord[0]; OUTPUT oT1 = result.texcoord[1]; OUTPUT oT2 = result.texcoord[2]; #line 1 "ScatterVS10.vsh" # Scattering Vertex shader # (c) 2002 Nathaniel Hoffman, Kenneth J. Mitchell and Arcot J. Preetham # # # # V - View direction # L - Sun direction # Theta - Scattering angle # s - Distance # E - Total extinction (including reflectance). TEMP r0, r1, r2, r3, r4, r5, r6, r7; # Transformation. DP4 oPos.x, iPos, WORLD_VIEW_PROJECTION[0]; DP4 oPos.y, iPos, WORLD_VIEW_PROJECTION[1]; DP4 oPos.z, iPos, WORLD_VIEW_PROJECTION[2]; DP4 oPos.w, iPos, WORLD_VIEW_PROJECTION[3]; # Dot product sun direction with vertex normal DP3 r0.xyzw, iNormal, SUN_DIRECTION; # scale by sun color MUL r0.xyz, r0, SUN_COLOR; # Sun angle information is in constant 14 # x component is the angle # y component is the multiplier for the +ve horizon angle (0 or 1) # z component is the multiplier for the -ve horizon angle (inverse of above) # Get appropriate horizon information into r0.w MUL r0.w, iTexCoord0.x, SUN_ANGLE.y; MUL r1.w, iTexCoord0.y, SUN_ANGLE.z; ADD r1.w, r0.w, r1.w; # Set r0.w if light angle is > horizon angle, otherwise clear it #sge r0.w, SUN_ANGLE.x, r1.w # Now calculate the 'shadow intensity' SUB r1.w, SUN_ANGLE.x, r1.w; # (light angle - horizon angle) MUL r1.w, r1.w, SHADOWSHARPNESS.x; # (Sharpness factor) * (angle delta) ADD r1.w, r1.w, ONE.x; # 1 + (5 * angle delta) MAX r1.w, r1.w, ZERO.x; # Clamp to zero MIN r0.w, r1.w, ONE.x; # clamp to one MUL oT2.xyz, r0, r0.w; # Multiply shadowing result through into output colour # Texture Coordinates. # 1 - Terrain texture # 2 - Cloud texture DP4 r1.x, iPos, WORLD[0]; DP4 r1.y, iPos, WORLD[1]; DP4 r1.z, iPos, WORLD[2]; DP4 r1.w, iPos, WORLD[3]; MAD oT0.xy, r1.xzzz, BASE_TEX_PROJECTION.xyyy, BASE_TEX_PROJECTION.zwww; MAD oT1.xy, r1.xzzz, CLOUD_TEX_PROJECTION_0.xyyy, CLOUD_TEX_PROJECTION_0.zwww; # Calculate V SUB r1, EYE_POSITION, r1; # V = eye - position DP3 r1.w, r1, r1; # Normalize V. RSQ r1.w, r1.w; MUL r1, r1, r1.w; # Angle (theta) between sun direction (L) and view direction (V). DP3 r0.x, r1, SUN_DIRECTION; # r0.x = [cos(theta)] = V.L MAD r0.y, r0.x, r0.x, CONSTANTS.x; # r0.y = [1+cos^2(theta)] = Phase1(theta) # Distance (s) DP4 r1.x, iPos, WORLD_VIEW[0]; # r1.z = s DP4 r1.y, iPos, WORLD_VIEW[1]; DP4 r1.z, iPos, WORLD_VIEW[2]; DP4 r1.w, iPos, WORLD_VIEW[3]; MOV r0.z, r1.z; # store in r0.z for future use. # Terms used in the scattering equation. # r0 = [cos(theta), 1+cos^2(theta), s] # Extinction term E MUL r1, BETA_1_PLUS_2, -r0.z; # -(beta_1+beta_2) * s MUL r1, r1, CONSTANTS.y; # -(beta_1+beta_2) * s * log_2 e EX2 r1.x, r1.x; EX2 r1.y, r1.y; EX2 r1.z, r1.z; # r1 = e^(-(beta_1 + beta_2) * s) = E1 # Apply Reflectance to E to get total net effective E MUL r3, r1, TERRAIN_REFLECTANCE; #r3 = E (Total extinction) # Phase2(theta) = (1-g^2)/(1+g-2g*cos(theta))^(3/2) # theta is 180 - actual theta (this corrects for sign) # HG = [1-g^2, 1+g, 2g] MAD r4.x, HG.z, r0.x, HG.y;# RSQ r4.x, r4.x; MUL r4.y, r4.x, r4.x; MUL r4.x, r4.y, r4.x; MUL r0.w, r4.x, HG.x; # r0.w = Phase2(theta) # Inscattering (I) = (Beta'_1 * Phase_1(theta) + Beta'_2 * Phase_2(theta)) * # [1-exp(-Beta_1*s).exp(-Beta_2*s)] / (Beta_1 + Beta_2) MUL r4, BETA_DASH_1, r0.y; MUL r5, BETA_DASH_2, r0.w; SUB r6, CONSTANTS.x, r1; MOV r7, BETA_1_PLUS_2; ADD r4, r4, r5; MUL r4, r4, r6; MUL r4, r4, ONE_OVER_BETA_1_PLUS_2; # r4 = I (inscattering) # Apply Inscattering contribution factors. MUL r4, r4, TERM_MULTIPLIERS.y; # Scale with Sun color & intesity. MUL r4, r4, SUN_COLOR; MUL r4, r4, SUN_COLOR.w; MUL r3, r3, SUN_COLOR; MUL r3, r3, SUN_COLOR.w; # Outputs. MOV oD0, r3; # Extinction ADD oD1, r4, AMBIENT; # Inscattering + Ambient term END