fire.fragment.fx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. precision highp float;
  2. // Constants
  3. uniform vec3 vEyePosition;
  4. // Input
  5. varying vec3 vPositionW;
  6. #ifdef NORMAL
  7. varying vec3 vNormalW;
  8. #endif
  9. #ifdef VERTEXCOLOR
  10. varying vec4 vColor;
  11. #endif
  12. // Samplers
  13. #ifdef DIFFUSE
  14. varying vec2 vDiffuseUV;
  15. uniform sampler2D diffuseSampler;
  16. uniform vec2 vDiffuseInfos;
  17. #endif
  18. // Fire
  19. uniform sampler2D distortionSampler;
  20. uniform sampler2D opacitySampler;
  21. varying vec2 vDistortionCoords1;
  22. varying vec2 vDistortionCoords2;
  23. varying vec2 vDistortionCoords3;
  24. #ifdef CLIPPLANE
  25. varying float fClipDistance;
  26. #endif
  27. // Fog
  28. #ifdef FOG
  29. #define FOGMODE_NONE 0.
  30. #define FOGMODE_EXP 1.
  31. #define FOGMODE_EXP2 2.
  32. #define FOGMODE_LINEAR 3.
  33. #define E 2.71828
  34. uniform vec4 vFogInfos;
  35. uniform vec3 vFogColor;
  36. varying float fFogDistance;
  37. float CalcFogFactor()
  38. {
  39. float fogCoeff = 1.0;
  40. float fogStart = vFogInfos.y;
  41. float fogEnd = vFogInfos.z;
  42. float fogDensity = vFogInfos.w;
  43. if (FOGMODE_LINEAR == vFogInfos.x)
  44. {
  45. fogCoeff = (fogEnd - fFogDistance) / (fogEnd - fogStart);
  46. }
  47. else if (FOGMODE_EXP == vFogInfos.x)
  48. {
  49. fogCoeff = 1.0 / pow(E, fFogDistance * fogDensity);
  50. }
  51. else if (FOGMODE_EXP2 == vFogInfos.x)
  52. {
  53. fogCoeff = 1.0 / pow(E, fFogDistance * fFogDistance * fogDensity * fogDensity);
  54. }
  55. return clamp(fogCoeff, 0.0, 1.0);
  56. }
  57. #endif
  58. vec4 bx2(vec4 x)
  59. {
  60. return vec4(2.0) * x - vec4(1.0);
  61. }
  62. void main(void) {
  63. // Clip plane
  64. #ifdef CLIPPLANE
  65. if (fClipDistance > 0.0)
  66. discard;
  67. #endif
  68. vec3 viewDirectionW = normalize(vEyePosition - vPositionW);
  69. // Base color
  70. vec4 baseColor = vec4(1., 1., 1., 1.);
  71. // Alpha
  72. float alpha = 1.0;
  73. #ifdef DIFFUSE
  74. // Fire
  75. const float distortionAmount0 = 0.092;
  76. const float distortionAmount1 = 0.092;
  77. const float distortionAmount2 = 0.092;
  78. vec2 heightAttenuation = vec2(0.3, 0.39);
  79. vec4 noise0 = texture2D(distortionSampler, vDistortionCoords1);
  80. vec4 noise1 = texture2D(distortionSampler, vDistortionCoords2);
  81. vec4 noise2 = texture2D(distortionSampler, vDistortionCoords3);
  82. vec4 noiseSum = bx2(noise0) * distortionAmount0 + bx2(noise1) * distortionAmount1 + bx2(noise2) * distortionAmount2;
  83. vec4 perturbedBaseCoords = vec4(vDiffuseUV, 0.0, 1.0) + noiseSum * (vDiffuseUV.y * heightAttenuation.x + heightAttenuation.y);
  84. vec4 opacityColor = texture2D(opacitySampler, perturbedBaseCoords.xy);
  85. baseColor = texture2D(diffuseSampler, perturbedBaseCoords.xy) * 2.0;
  86. baseColor *= opacityColor;
  87. #ifdef ALPHATEST
  88. if (opacityColor.r < 0.1)
  89. discard;
  90. #endif
  91. baseColor.rgb *= vDiffuseInfos.y;
  92. #endif
  93. #ifdef VERTEXCOLOR
  94. baseColor.rgb *= vColor.rgb;
  95. #endif
  96. // Bump
  97. #ifdef NORMAL
  98. vec3 normalW = normalize(vNormalW);
  99. #else
  100. vec3 normalW = vec3(1.0, 1.0, 1.0);
  101. #endif
  102. // Lighting
  103. vec3 diffuseBase = vec3(1.0, 1.0, 1.0);
  104. #ifdef VERTEXALPHA
  105. alpha *= vColor.a;
  106. #endif
  107. // Composition
  108. vec4 color = vec4(baseColor.rgb, alpha);
  109. #ifdef FOG
  110. float fog = CalcFogFactor();
  111. color.rgb = fog * color.rgb + (1.0 - fog) * vFogColor;
  112. #endif
  113. gl_FragColor = color;
  114. }