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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file WLCloudsF.glsl
  3.  *
  4.  * Copyright (c) 2005-$CurrentYear$, Linden Research, Inc.
  5.  * $License$
  6.  */
  7. /////////////////////////////////////////////////////////////////////////
  8. // The fragment shader for the sky
  9. /////////////////////////////////////////////////////////////////////////
  10. varying vec4 vary_CloudColorSun;
  11. varying vec4 vary_CloudColorAmbient;
  12. varying float vary_CloudDensity;
  13. uniform sampler2D cloud_noise_texture;
  14. uniform vec4 cloud_pos_density1;
  15. uniform vec4 cloud_pos_density2;
  16. uniform vec4 gamma;
  17. /// Soft clips the light with a gamma correction
  18. vec3 scaleSoftClip(vec3 light) {
  19. //soft clip effect:
  20. light = 1. - clamp(light, vec3(0.), vec3(1.));
  21. light = 1. - pow(light, gamma.xxx);
  22. return light;
  23. }
  24. void main()
  25. {
  26. // Set variables
  27. vec2 uv1 = gl_TexCoord[0].xy;
  28. vec2 uv2 = gl_TexCoord[1].xy;
  29. vec4 cloudColorSun = vary_CloudColorSun;
  30. vec4 cloudColorAmbient = vary_CloudColorAmbient;
  31. float cloudDensity = vary_CloudDensity;
  32. vec2 uv3 = gl_TexCoord[2].xy;
  33. vec2 uv4 = gl_TexCoord[3].xy;
  34. // Offset texture coords
  35. uv1 += cloud_pos_density1.xy; //large texture, visible density
  36. uv2 += cloud_pos_density1.xy; //large texture, self shadow
  37. uv3 += cloud_pos_density2.xy; //small texture, visible density
  38. uv4 += cloud_pos_density2.xy; //small texture, self shadow
  39. // Compute alpha1, the main cloud opacity
  40. float alpha1 = (texture2D(cloud_noise_texture, uv1).x - 0.5) + (texture2D(cloud_noise_texture, uv3).x - 0.5) * cloud_pos_density2.z;
  41. alpha1 = min(max(alpha1 + cloudDensity, 0.) * 10. * cloud_pos_density1.z, 1.);
  42. // And smooth
  43. alpha1 = 1. - alpha1 * alpha1;
  44. alpha1 = 1. - alpha1 * alpha1;
  45. // Compute alpha2, for self shadowing effect
  46. // (1 - alpha2) will later be used as percentage of incoming sunlight
  47. float alpha2 = (texture2D(cloud_noise_texture, uv2).x - 0.5);
  48. alpha2 = min(max(alpha2 + cloudDensity, 0.) * 2.5 * cloud_pos_density1.z, 1.);
  49. // And smooth
  50. alpha2 = 1. - alpha2;
  51. alpha2 = 1. - alpha2 * alpha2;
  52. // Combine
  53. vec4 color;
  54. color = (cloudColorSun*(1.-alpha2) + cloudColorAmbient);
  55. color *= 2.;
  56. /// Gamma correct for WL (soft clip effect).
  57. gl_FragColor.rgb = scaleSoftClip(color.rgb);
  58. gl_FragColor.a = alpha1;
  59. }