skyBox.frag 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #version 330 core
  2. //
  3. // Atmospheric scattering fragment shader
  4. //
  5. // Author: Sean O'Neil
  6. //
  7. // Copyright (c) 2004 Sean O'Neil
  8. //
  9. //--//https://developer.nvidia.com/gpugems/gpugems2/part-ii-shading-lighting-and-shadows/chapter-16-accurate-atmospheric-scattering
  10. //moddified
  11. layout(location = 0) out vec4 outColor;
  12. in vec3 v_vsViewDirection;
  13. out vec3 fragColor;
  14. vec3 u_skyColor = vec3(98, 131, 156)/255.0;
  15. vec3 u_sunColor = vec3(0.098, 0.091, 0.014);
  16. float u_g = 0.65;
  17. vec3 u_lightPos = normalize(vec3(-1, 0.84, -1));
  18. void main (void)
  19. {
  20. vec3 skyColor = u_skyColor;
  21. vec3 sunColor = u_sunColor*0.5;
  22. vec3 localPos = normalize(v_vsViewDirection);
  23. vec3 lightPos = normalize(u_lightPos);
  24. vec3 upVector = vec3(0,1,0);
  25. float fCosEarth = max(dot(localPos, upVector),0);
  26. float foneMinusCosEarth = 1-fCosEarth;
  27. //float fCosSunEarth = 1-max(dot(lightPos, upVector), 0);
  28. float fCosSunEarth = 1-abs(dot(lightPos, upVector));
  29. float g2 = u_g * u_g;
  30. float fCosSun = dot(lightPos, localPos);
  31. float fMiePhase = 1.5 * ((1.0 - g2) / (2.0 + g2)) * (1.0 + fCosSun*fCosSun) / pow(1.0 + g2 - 2.0*u_g*fCosSun, 1.5);
  32. float horizonIntensity = 1.5 * ((1.0 - g2) / (2.0 + g2)) * (1.0 + fCosSunEarth*fCosSunEarth) / pow(1.0 + g2 - 2.0*u_g*fCosSunEarth, 1.5);
  33. vec3 computedSkyColor = skyColor
  34. + fMiePhase * sunColor
  35. + (fCosSunEarth)*sunColor* 1 * pow(foneMinusCosEarth, 16)
  36. + pow(foneMinusCosEarth, 16) * sunColor * 1
  37. ;
  38. //u_groundColor = vec3(0.2,0.2,0.2);
  39. vec3 computedGroundColor = vec3(0.1,0.2,0.1);// + pow(foneMinusCosEarth, 16) * sunColor;
  40. //if(fCosEarth < 0.02)
  41. //{
  42. // float a = min(max(fCosEarth/0.02,0), 1);
  43. // a*=a*a;
  44. // fragColor.rgb = mix(computedGroundColor.rgb, computedSkyColor.rgb, vec3(a));
  45. //}else
  46. {
  47. fragColor.rgb = computedSkyColor;
  48. }
  49. //fragColor.rgb = firstColor + vec3(fCos);
  50. }