fog.chunk 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. // fog related calculations
  2. //pos, cc_cameraPos.xyz, cc_fogBase.x, cc_fogBase.y
  3. float LinearFog(vec4 pos, vec3 cameraPos, float fogStart, float fogEnd) {
  4. vec4 wPos = pos;
  5. float cam_dis = distance(cameraPos, wPos.xyz);
  6. return clamp((fogEnd - cam_dis) / (fogEnd - fogStart), 0., 1.);
  7. }
  8. //pos, cc_cameraPos.xyz, cc_fogBase.x, cc_fogBase.z, cc_fogAdd.z
  9. float ExpFog(vec4 pos, vec3 cameraPos, float fogStart, float fogDensity, float fogAtten) {
  10. vec4 wPos = pos;
  11. float cam_dis = max(distance(cameraPos, wPos.xyz) - fogStart, 0.0) / fogAtten * 4.;
  12. float f = exp(-cam_dis * fogDensity);
  13. return f;
  14. }
  15. float ExpSquaredFog(vec4 pos, vec3 cameraPos, float fogStart, float fogDensity, float fogAtten) {
  16. vec4 wPos = pos;
  17. float cam_dis = max(distance(cameraPos, wPos.xyz) - fogStart, 0.0) / fogAtten * 4.;
  18. float f = exp(-cam_dis * cam_dis * fogDensity * fogDensity);
  19. return f;
  20. }
  21. //pos, cc_cameraPos.xyz, cc_fogAdd.x, cc_fogAdd.y, cc_fogAdd.z
  22. float LayeredFog(vec4 pos, vec3 cameraPos, float fogTop, float fogRange, float fogAtten) {
  23. vec4 wPos = pos;
  24. vec3 camWorldProj = cameraPos.xyz;
  25. camWorldProj.y = 0.;
  26. vec3 worldPosProj = wPos.xyz;
  27. worldPosProj.y = 0.;
  28. float fDeltaD = distance(worldPosProj, camWorldProj) / fogAtten * 2.0;
  29. float fDeltaY, fDensityIntegral;
  30. if (cameraPos.y > fogTop) {
  31. if (wPos.y < fogTop) {
  32. fDeltaY = (fogTop - wPos.y) / fogRange * 2.0;
  33. fDensityIntegral = fDeltaY * fDeltaY * 0.5;
  34. }
  35. else {
  36. fDeltaY = 0.;
  37. fDensityIntegral = 0.;
  38. }
  39. }
  40. else {
  41. if (wPos.y < fogTop) {
  42. float fDeltaA = (fogTop - cameraPos.y) / fogRange * 2.;
  43. float fDeltaB = (fogTop - wPos.y) / fogRange * 2.;
  44. fDeltaY = abs(fDeltaA - fDeltaB);
  45. fDensityIntegral = abs((fDeltaA * fDeltaA * 0.5) - (fDeltaB * fDeltaB * 0.5));
  46. }
  47. else {
  48. fDeltaY = abs(fogTop - cameraPos.y) / fogRange * 2.;
  49. fDensityIntegral = abs(fDeltaY * fDeltaY * 0.5);
  50. }
  51. }
  52. float fDensity;
  53. if (fDeltaY != 0.) {
  54. fDensity = (sqrt(1.0 + ((fDeltaD / fDeltaY) * (fDeltaD / fDeltaY)))) * fDensityIntegral;
  55. }
  56. else {
  57. fDensity = 0.;
  58. }
  59. float f = exp(-fDensity);
  60. return f;
  61. }