cloudsV.glsl
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:4k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file WLCloudsV.glsl
  3.  *
  4.  * Copyright (c) 2005-$CurrentYear$, Linden Research, Inc.
  5.  * $License$
  6.  */
  7. //////////////////////////////////////////////////////////////////////////
  8. // The vertex shader for creating the atmospheric sky
  9. ///////////////////////////////////////////////////////////////////////////////
  10. // Output parameters
  11. varying vec4 vary_CloudColorSun;
  12. varying vec4 vary_CloudColorAmbient;
  13. varying float vary_CloudDensity;
  14. // Inputs
  15. uniform vec3 camPosLocal;
  16. uniform vec4 lightnorm;
  17. uniform vec4 sunlight_color;
  18. uniform vec4 ambient;
  19. uniform vec4 blue_horizon;
  20. uniform vec4 blue_density;
  21. uniform vec4 haze_horizon;
  22. uniform vec4 haze_density;
  23. uniform vec4 cloud_shadow;
  24. uniform vec4 density_multiplier;
  25. uniform vec4 max_y;
  26. uniform vec4 glow;
  27. uniform vec4 cloud_color;
  28. uniform vec4 cloud_scale;
  29. void main()
  30. {
  31. // World / view / projection
  32. gl_Position = ftransform();
  33. gl_TexCoord[0] = gl_MultiTexCoord0;
  34. // Get relative position
  35. vec3 P = gl_Vertex.xyz - camPosLocal.xyz + vec3(0,50,0);
  36. // Set altitude
  37. if (P.y > 0.)
  38. {
  39. P *= (max_y.x / P.y);
  40. }
  41. else
  42. {
  43. P *= (-32000. / P.y);
  44. }
  45. // Can normalize then
  46. vec3 Pn = normalize(P);
  47. float  Plen = length(P);
  48. // Initialize temp variables
  49. vec4 temp1 = vec4(0.);
  50. vec4 temp2 = vec4(0.);
  51. vec4 blue_weight;
  52. vec4 haze_weight;
  53. vec4 sunlight = sunlight_color;
  54. vec4 light_atten;
  55. // Sunlight attenuation effect (hue and brightness) due to atmosphere
  56. // this is used later for sunlight modulation at various altitudes
  57. light_atten = (blue_density * 1.0 + haze_density.x * 0.25) * (density_multiplier.x * max_y.x);
  58. // Calculate relative weights
  59. temp1 = blue_density + haze_density.x;
  60. blue_weight = blue_density / temp1;
  61. haze_weight = haze_density.x / temp1;
  62. // Compute sunlight from P & lightnorm (for long rays like sky)
  63. temp2.y = max(0., max(0., Pn.y) * 1.0 + lightnorm.y );
  64. temp2.y = 1. / temp2.y;
  65. sunlight *= exp( - light_atten * temp2.y);
  66. // Distance
  67. temp2.z = Plen * density_multiplier.x;
  68. // Transparency (-> temp1)
  69. // ATI Bugfix -- can't store temp1*temp2.z in a variable because the ati
  70. // compiler gets confused.
  71. temp1 = exp(-temp1 * temp2.z);
  72. // Compute haze glow
  73. temp2.x = dot(Pn, lightnorm.xyz);
  74. temp2.x = 1. - temp2.x;
  75. // temp2.x is 0 at the sun and increases away from sun
  76. temp2.x = max(temp2.x, .001);
  77. // Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
  78. temp2.x *= glow.x;
  79. // Higher glow.x gives dimmer glow (because next step is 1 / "angle")
  80. temp2.x = pow(temp2.x, glow.z);
  81. // glow.z should be negative, so we're doing a sort of (1 / "angle") function
  82. // Add "minimum anti-solar illumination"
  83. temp2.x += .25;
  84. // Increase ambient when there are more clouds
  85. vec4 tmpAmbient = ambient;
  86. tmpAmbient += (1. - tmpAmbient) * cloud_shadow.x * 0.5; 
  87. // Dim sunlight by cloud shadow percentage
  88. sunlight *= (1. - cloud_shadow.x);
  89. // Haze color below cloud
  90. vec4 additiveColorBelowCloud = (   blue_horizon * blue_weight * (sunlight + tmpAmbient)
  91. + (haze_horizon.r * haze_weight) * (sunlight * temp2.x + tmpAmbient)
  92.  );
  93. // CLOUDS
  94. sunlight = sunlight_color;
  95. temp2.y = max(0., lightnorm.y * 2.);
  96. temp2.y = 1. / temp2.y;
  97. sunlight *= exp( - light_atten * temp2.y);
  98. // Cloud color out
  99. vary_CloudColorSun = (sunlight * temp2.x) * cloud_color;
  100. vary_CloudColorAmbient = tmpAmbient * cloud_color;
  101. // Attenuate cloud color by atmosphere
  102. temp1 = sqrt(temp1); //less atmos opacity (more transparency) below clouds
  103. vary_CloudColorSun *= temp1;
  104. vary_CloudColorAmbient *= temp1;
  105. vec4 oHazeColorBelowCloud = additiveColorBelowCloud * (1. - temp1);
  106. // Make a nice cloud density based on the cloud_shadow value that was passed in.
  107. vary_CloudDensity = 2. * (cloud_shadow.x - 0.25);
  108. // Texture coords
  109. gl_TexCoord[0] = gl_MultiTexCoord0;
  110. gl_TexCoord[0].xy -= 0.5;
  111. gl_TexCoord[0].xy /= cloud_scale.x;
  112. gl_TexCoord[0].xy += 0.5;
  113. gl_TexCoord[1] = gl_TexCoord[0];
  114. gl_TexCoord[1].x += lightnorm.x * 0.0125;
  115. gl_TexCoord[1].y += lightnorm.z * 0.0125;
  116. gl_TexCoord[2] = gl_TexCoord[0] * 16.;
  117. gl_TexCoord[3] = gl_TexCoord[1] * 16.;
  118. // Combine these to minimize register use
  119. vary_CloudColorAmbient += oHazeColorBelowCloud;
  120. // needs this to compile on mac
  121. //vary_AtmosAttenuation = vec3(0.0,0.0,0.0);
  122. // END CLOUDS
  123. }