sky.glsl 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. vec3 SKY_lighterBlue = vec3(0.39, 0.57, 0.86) * 0.35;
  2. vec3 SKY_midBlue = vec3(0.1, 0.11, 0.1) * 0.5;
  3. vec3 SKY_darkerBlue = vec3(0.0);
  4. vec3 SKY_SUN_COLOUR = vec3(0.5);
  5. vec3 SKY_SUN_GLOW_COLOUR = vec3(0.15, 0.2, 0.25);
  6. vec3 SKY_FOG_GLOW_COLOUR = vec3(vec3(0.75, 0.75, 1.0) * 0.15);
  7. float SKY_POWER = 16.0;
  8. float SUN_POWER = 128.0;
  9. float SKY_DARK_POWER = 2.0;
  10. float SKY_fogScatterDensity = 0.0002;
  11. float SKY_fogExtinctionDensity = 0.006;
  12. vec3 SUN_DIR = vec3(-1.0, 0.45, 1.0);
  13. // This is just a bunch of nonsense since I didn't want to implement a full
  14. // sky model. It's just a simple gradient with a sun and some fog.
  15. vec3 CalculateSkyLighting(vec3 viewDir, vec3 normalDir) {
  16. vec3 lighterBlue = col3(GAMMA_TO_LINEAR(SKY_lighterBlue));
  17. vec3 midBlue = col3(GAMMA_TO_LINEAR(SKY_midBlue));
  18. vec3 darkerBlue = col3(GAMMA_TO_LINEAR(SKY_darkerBlue));
  19. vec3 SUN_COLOUR = col3(GAMMA_TO_LINEAR(SKY_SUN_COLOUR));
  20. vec3 SUN_GLOW_COLOUR = col3(GAMMA_TO_LINEAR(SKY_SUN_GLOW_COLOUR));
  21. float viewDirY = linearstep(-0.01, 1.0, viewDir.y);
  22. float skyGradientMixFactor = saturate(viewDirY);
  23. vec3 skyGradient = mix(darkerBlue, lighterBlue, exp(-sqrt(saturate(viewDirY)) * 2.0));
  24. vec3 sunDir = normalize(SUN_DIR);
  25. float mu = 1.0 - saturate(dot(viewDir, sunDir));
  26. vec3 colour = skyGradient + SUN_GLOW_COLOUR * saturate(exp(-sqrt(mu) * 10.0)) * 0.75;
  27. colour += SUN_COLOUR * smoothstep(0.9997, 0.9998, 1.0 - mu);
  28. colour = oklabToRGB(colour);
  29. return colour;
  30. }
  31. vec3 CalculateSkyFog(vec3 normalDir) {
  32. return CalculateSkyLighting(normalDir, normalDir);
  33. }
  34. vec3 CalculateFog(vec3 baseColour, vec3 viewDir, float sceneDepth) {
  35. vec3 fogSkyColour = CalculateSkyFog(-viewDir);
  36. float fogDepth = sceneDepth * sceneDepth;
  37. float fogScatterFactor = exp(-SKY_fogScatterDensity * SKY_fogScatterDensity * fogDepth);
  38. float fogExtinctionFactor = exp(-SKY_fogExtinctionDensity * SKY_fogExtinctionDensity * fogDepth);
  39. vec3 finalColour = baseColour * fogExtinctionFactor + fogSkyColour * (1.0 - fogScatterFactor);
  40. return finalColour;
  41. }