123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- //gl,
- //{"opacity":0.9847131371498108,"distance":177.83547973632812,"dispersion":0.32692307233810425,"type":2,"skyIllum":0.7551020383834839,"lightIllum":1,"color":[1,1,1]}
- /**
- *
- * @param {webgl自带的上下文变量类型} gl
- * @param {*} fogInfo
- */
- function FdageFog(gl, fogInfo) {
- this.desc = fogInfo;
- this.gl = gl;
- this.iblShader = gl.shaderCache.fromURLs("fogvert.glsl", "fogfrag.glsl", ["#define FOG_IBL"]);
- var b = ["#define FOG_DIR"];
- this.dirShader = gl.shaderCache.fromURLs("fogvert.glsl", "fogfrag.glsl", b);
- b.push("#define FOG_SHADOWS");
- this.dirShaderShadow = gl.shaderCache.fromURLs("fogvert.glsl", "fogfrag.glsl", b);
- b = ["#define FOG_SPOT"];
- this.spotShader = gl.shaderCache.fromURLs("fogvert.glsl", "fogfrag.glsl", b);
- b.push("#define FOG_SHADOWS");
- this.spotShaderShadow = gl.shaderCache.fromURLs("fogvert.glsl", "fogfrag.glsl", b);
- b = ["#define FOG_OMNI"];
- this.omniShaderShadow = this.omniShader = gl.shaderCache.fromURLs("fogvert.glsl", "fogfrag.glsl", b);
- this.fullscreenTriangle = gl.createBuffer();
- gl.bindBuffer(gl.ARRAY_BUFFER, this.fullscreenTriangle);
- b = new Float32Array([0, 0, 2, 0, 0, 2]);
- gl.bufferData(gl.ARRAY_BUFFER, b, gl.STATIC_DRAW);
- gl.bindBuffer(gl.ARRAY_BUFFER, null)
- }
- FdageFog.prototype.draw = function(scene, texture) {
- var b = this.gl
- , d = scene.view
- , e = d.projectionMatrix
- , f = Matrix.empty();
- Matrix.mul(f, d.viewMatrix, d.projectionMatrix);
- Matrix.invert(f, d.viewProjectionMatrix);
- f = [e[10] + e[11], -e[14], -2 * e[11]];
- e = [-2 / e[0], -2 / e[5], (1 - e[8]) / e[0], (1 - e[9]) / e[5]];
- b.enable(b.BLEND);
- b.blendFunc(b.ONE, b.ONE_MINUS_SRC_ALPHA);
- for (var g = 0; g < scene.lights.count + 1; ++g) {
- var h = g - 1, k = h < scene.lights.shadowCount, n;
- 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;
- n.bind();
- var m = n.params;
- b.uniform3fv(m.uDepthToZ, f);
- b.uniform4fv(m.uUnproject, e);
- b.uniformMatrix4fv(m.uInvViewMatrix, !1, d.transform);
- b.uniform1f(m.uFogInvDistance, 1 / this.desc.distance);
- b.uniform1f(m.uFogOpacity, this.desc.opacity * (1 - scene.stripData.activeFade()));
- b.uniform1f(m.uFogDispersion, 1 - this.desc.dispersion);
- var l = [0, 0, 0];
- l[this.desc.type] = 1;
- b.uniform3fv(m.uFogType, l);
- b.uniform3fv(m.uFogColor, this.desc.color);
- b.uniform1f(m.uFogIllum, 0 == g ? this.desc.skyIllum : this.desc.lightIllum);
- b.uniformMatrix4fv(m.uLightMatrix, !1, scene.lights.invMatrix);
- if (0 == g) {
- h = new Float32Array(scene.sky.diffuseCoefficients);
- for (k = 4; 16 > k; ++k)
- h[k] *= 1 - this.desc.dispersion;
- for (k = 16; 36 > k; ++k)
- h[k] *= 1 - this.desc.dispersion * this.desc.dispersion;
- b.uniform4fv(m.uFogLightSphere, h)
- } else {
- var p = scene.lights.getLightPos(h)
- , p = Matrix.mul4(Vect.empty(), scene.lights.invMatrix, p[0], p[1], p[2], p[3])
- , l = scene.lights.getLightDir(h)
- , l = Matrix.mulVec(Vect.empty(), scene.lights.invMatrix, l[0], l[1], l[2]);
- b.uniform4fv(m.uLightPosition, p);
- b.uniform3fv(m.uLightColor, scene.lights.getColor(h));
- var p = 0.01745329251 * scene.lights.spot[3 * h]
- , r = Math.cos(0.5 * p);
- b.uniform4fv(m.uSpotParams, [-l[0], -l[1], -l[2], 0 < p ? r * r : 0]);
- b.uniform4fv(m.uLightAttenuation, [scene.lights.parameters[3 * h + 0], scene.lights.parameters[3 * h + 1], scene.lights.parameters[3 * h + 2], r]);
- k && (k = Matrix.mul(Matrix.empty(), scene.lights.finalTransformBuffer.subarray(16 * h), scene.lights.matrix),
- b.uniformMatrix4fv(m.uShadowProj, !1, k),
- scene.shadow.depthTextures[h].bind(n.samplers.uShadowMap),
- h = 0,
- 1 < scene.postRender.sampleCount && (h = scene.postRender.currentSample() / scene.postRender.sampleCount),
- b.uniform1f(m.uDitherOffset, h),
- b.uniform3fv(m.uAABBMin, scene.bounds.min),
- b.uniform3fv(m.uAABBMax, scene.bounds.max),
- h = Vect.lerp(Vect.empty(), scene.bounds.min, scene.bounds.max, 0.5),
- k = Vect.distance(h, scene.bounds.min),
- b.uniform4f(m.uCylinder, h[0], h[1], h[2], k * k))
- }
- texture.bind(n.samplers.tDepth);
- n = n.attribs.vCoord;
- b.bindBuffer(b.ARRAY_BUFFER, this.fullscreenTriangle);
- b.enableVertexAttribArray(n);
- b.vertexAttribPointer(n, 2, b.FLOAT, !1, 0, 0);
- b.drawArrays(b.TRIANGLES, 0, 3);
- b.disableVertexAttribArray(n);
- b.bindBuffer(b.ARRAY_BUFFER, null);
- }
- b.disable(b.BLEND)
- };
- FdageFog.prototype.complete = function() {
- return this.iblShader.complete() && this.dirShader.complete() && this.dirShaderShadow.complete() && this.spotShader.complete() && this.spotShaderShadow.complete() && this.omniShader.complete() && this.omniShaderShadow.complete()
- };
- export { FdageFog };
|