FdageFog.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. //gl,
  2. //{"opacity":0.9847131371498108,"distance":177.83547973632812,"dispersion":0.32692307233810425,"type":2,"skyIllum":0.7551020383834839,"lightIllum":1,"color":[1,1,1]}
  3. /**
  4. *
  5. * @param {webgl自带的上下文变量类型} gl
  6. * @param {*} fogInfo
  7. */
  8. function FdageFog(gl, fogInfo) {
  9. this.desc = fogInfo;
  10. this.gl = gl;
  11. this.iblShader = gl.shaderCache.fromURLs("fogvert.glsl", "fogfrag.glsl", ["#define FOG_IBL"]);
  12. var b = ["#define FOG_DIR"];
  13. this.dirShader = gl.shaderCache.fromURLs("fogvert.glsl", "fogfrag.glsl", b);
  14. b.push("#define FOG_SHADOWS");
  15. this.dirShaderShadow = gl.shaderCache.fromURLs("fogvert.glsl", "fogfrag.glsl", b);
  16. b = ["#define FOG_SPOT"];
  17. this.spotShader = gl.shaderCache.fromURLs("fogvert.glsl", "fogfrag.glsl", b);
  18. b.push("#define FOG_SHADOWS");
  19. this.spotShaderShadow = gl.shaderCache.fromURLs("fogvert.glsl", "fogfrag.glsl", b);
  20. b = ["#define FOG_OMNI"];
  21. this.omniShaderShadow = this.omniShader = gl.shaderCache.fromURLs("fogvert.glsl", "fogfrag.glsl", b);
  22. this.fullscreenTriangle = gl.createBuffer();
  23. gl.bindBuffer(gl.ARRAY_BUFFER, this.fullscreenTriangle);
  24. b = new Float32Array([0, 0, 2, 0, 0, 2]);
  25. gl.bufferData(gl.ARRAY_BUFFER, b, gl.STATIC_DRAW);
  26. gl.bindBuffer(gl.ARRAY_BUFFER, null)
  27. }
  28. FdageFog.prototype.draw = function(scene, texture) {
  29. var b = this.gl
  30. , d = scene.view
  31. , e = d.projectionMatrix
  32. , f = Matrix.empty();
  33. Matrix.mul(f, d.viewMatrix, d.projectionMatrix);
  34. Matrix.invert(f, d.viewProjectionMatrix);
  35. f = [e[10] + e[11], -e[14], -2 * e[11]];
  36. e = [-2 / e[0], -2 / e[5], (1 - e[8]) / e[0], (1 - e[9]) / e[5]];
  37. b.enable(b.BLEND);
  38. b.blendFunc(b.ONE, b.ONE_MINUS_SRC_ALPHA);
  39. for (var g = 0; g < scene.lights.count + 1; ++g) {
  40. var h = g - 1, k = h < scene.lights.shadowCount, n;
  41. n = 0 == g ? this.iblShader : 0 < scene.lights.spot[3 * h] ? k ? this.spotShaderShadow : this.spotShader : 0 < scene.lights.getLightPos(h)[3] ? this.omniShader : k ? this.dirShaderShadow : this.dirShader;
  42. n.bind();
  43. var m = n.params;
  44. b.uniform3fv(m.uDepthToZ, f);
  45. b.uniform4fv(m.uUnproject, e);
  46. b.uniformMatrix4fv(m.uInvViewMatrix, !1, d.transform);
  47. b.uniform1f(m.uFogInvDistance, 1 / this.desc.distance);
  48. b.uniform1f(m.uFogOpacity, this.desc.opacity * (1 - scene.stripData.activeFade()));
  49. b.uniform1f(m.uFogDispersion, 1 - this.desc.dispersion);
  50. var l = [0, 0, 0];
  51. l[this.desc.type] = 1;
  52. b.uniform3fv(m.uFogType, l);
  53. b.uniform3fv(m.uFogColor, this.desc.color);
  54. b.uniform1f(m.uFogIllum, 0 == g ? this.desc.skyIllum : this.desc.lightIllum);
  55. b.uniformMatrix4fv(m.uLightMatrix, !1, scene.lights.invMatrix);
  56. if (0 == g) {
  57. h = new Float32Array(scene.sky.diffuseCoefficients);
  58. for (k = 4; 16 > k; ++k)
  59. h[k] *= 1 - this.desc.dispersion;
  60. for (k = 16; 36 > k; ++k)
  61. h[k] *= 1 - this.desc.dispersion * this.desc.dispersion;
  62. b.uniform4fv(m.uFogLightSphere, h)
  63. } else {
  64. var p = scene.lights.getLightPos(h)
  65. , p = Matrix.mul4(Vect.empty(), scene.lights.invMatrix, p[0], p[1], p[2], p[3])
  66. , l = scene.lights.getLightDir(h)
  67. , l = Matrix.mulVec(Vect.empty(), scene.lights.invMatrix, l[0], l[1], l[2]);
  68. b.uniform4fv(m.uLightPosition, p);
  69. b.uniform3fv(m.uLightColor, scene.lights.getColor(h));
  70. var p = 0.01745329251 * scene.lights.spot[3 * h]
  71. , r = Math.cos(0.5 * p);
  72. b.uniform4fv(m.uSpotParams, [-l[0], -l[1], -l[2], 0 < p ? r * r : 0]);
  73. b.uniform4fv(m.uLightAttenuation, [scene.lights.parameters[3 * h + 0], scene.lights.parameters[3 * h + 1], scene.lights.parameters[3 * h + 2], r]);
  74. k && (k = Matrix.mul(Matrix.empty(), scene.lights.finalTransformBuffer.subarray(16 * h), scene.lights.matrix),
  75. b.uniformMatrix4fv(m.uShadowProj, !1, k),
  76. scene.shadow.depthTextures[h].bind(n.samplers.uShadowMap),
  77. h = 0,
  78. 1 < scene.postRender.sampleCount && (h = scene.postRender.currentSample() / scene.postRender.sampleCount),
  79. b.uniform1f(m.uDitherOffset, h),
  80. b.uniform3fv(m.uAABBMin, scene.bounds.min),
  81. b.uniform3fv(m.uAABBMax, scene.bounds.max),
  82. h = Vect.lerp(Vect.empty(), scene.bounds.min, scene.bounds.max, 0.5),
  83. k = Vect.distance(h, scene.bounds.min),
  84. b.uniform4f(m.uCylinder, h[0], h[1], h[2], k * k))
  85. }
  86. texture.bind(n.samplers.tDepth);
  87. n = n.attribs.vCoord;
  88. b.bindBuffer(b.ARRAY_BUFFER, this.fullscreenTriangle);
  89. b.enableVertexAttribArray(n);
  90. b.vertexAttribPointer(n, 2, b.FLOAT, !1, 0, 0);
  91. b.drawArrays(b.TRIANGLES, 0, 3);
  92. b.disableVertexAttribArray(n);
  93. b.bindBuffer(b.ARRAY_BUFFER, null);
  94. }
  95. b.disable(b.BLEND)
  96. };
  97. FdageFog.prototype.complete = function() {
  98. return this.iblShader.complete() && this.dirShader.complete() && this.dirShaderShadow.complete() && this.spotShader.complete() && this.spotShaderShadow.complete() && this.omniShader.complete() && this.omniShaderShadow.complete()
  99. };
  100. export { FdageFog };