optimization

This commit is contained in:
Pavel Dobryakov
2017-08-08 13:21:50 +03:00
parent 94d465cbdb
commit b684f712a3

View File

@@ -16,7 +16,7 @@ resizeCanvas();
const TEXTURE_WIDTH = gl.drawingBufferWidth; const TEXTURE_WIDTH = gl.drawingBufferWidth;
const TEXTURE_HEIGHT = gl.drawingBufferHeight; const TEXTURE_HEIGHT = gl.drawingBufferHeight;
const CELL_SIZE = 1; const CELL_SIZE = 1.25;
class GLProgram { class GLProgram {
constructor (vertexShader, fragmentShader) { constructor (vertexShader, fragmentShader) {
@@ -163,12 +163,12 @@ const initDensityShader = compileShader(gl.FRAGMENT_SHADER, `
varying vec2 vUv; varying vec2 vUv;
void main () { void main () {
//float d = mod(floor(vUv.x * 10.0) + floor(vUv.y * 10.0), 2.0); float d = mod(floor(vUv.x * 10.0) + floor(vUv.y * 10.0), 2.0);
vec2 p = vec2(0.5, 0.2); // vec2 p = vec2(0.5, 0.2);
float d = length(vUv - p); // float d = length(vUv - p);
float radius = 0.1; // float radius = 0.1;
float c = smoothstep(radius - .01, radius + .01, d); // float c = smoothstep(radius - .01, radius + .01, d);
gl_FragColor = vec4(vec3(c * 1000.0), 1.0); gl_FragColor = vec4(vec3(d), 1.0);
} }
`); `);
@@ -190,12 +190,11 @@ const advectionShader = compileShader(gl.FRAGMENT_SHADER, `
uniform sampler2D uSource; uniform sampler2D uSource;
uniform vec2 wh_inv; uniform vec2 wh_inv;
uniform float dt; uniform float dt;
uniform float rdx;
uniform float dissipation; uniform float dissipation;
void main () { void main () {
vec2 velocity = texture2D(uVelocity, vUv).xy; vec2 velocity = texture2D(uVelocity, vUv).xy;
vec2 coord = vUv - dt * rdx * velocity * wh_inv; vec2 coord = vUv - dt * velocity * wh_inv;
gl_FragColor = dissipation * texture2D(uSource, coord); gl_FragColor = dissipation * texture2D(uSource, coord);
gl_FragColor.a = 1.0; gl_FragColor.a = 1.0;
} }
@@ -278,7 +277,6 @@ let pointer = {
y: 0 y: 0
} }
// gl.bindTexture(gl.TEXTURE_2D, null);
initDensityProgram.bind(); initDensityProgram.bind();
blit(density.first[1]); blit(density.first[1]);
initVelocityProgram.bind(); initVelocityProgram.bind();
@@ -290,27 +288,37 @@ function Update () {
resizeCanvas(); resizeCanvas();
gl.viewport(0, 0, TEXTURE_WIDTH, TEXTURE_HEIGHT); gl.viewport(0, 0, TEXTURE_WIDTH, TEXTURE_HEIGHT);
// advect velocity
advectionProgram.bind();
gl.uniform1i(advectionProgram.uniforms.uVelocity, velocity.first[2]);
gl.uniform1i(advectionProgram.uniforms.uSource, velocity.first[2]);
gl.uniform2f(advectionProgram.uniforms.wh_inv, 1.0 / TEXTURE_WIDTH, 1.0 / TEXTURE_HEIGHT);
gl.uniform1f(advectionProgram.uniforms.dt, 0.125);
gl.uniform1f(advectionProgram.uniforms.dissipation, 1.0);
blit(velocity.second[1]);
velocity.swap();
// advect density // advect density
advectionProgram.bind(); // advectionProgram.bind();
gl.uniform1i(advectionProgram.uniforms.uVelocity, velocity.first[2]); gl.uniform1i(advectionProgram.uniforms.uVelocity, velocity.first[2]);
gl.uniform1i(advectionProgram.uniforms.uSource, density.first[2]); gl.uniform1i(advectionProgram.uniforms.uSource, density.first[2]);
gl.uniform2f(advectionProgram.uniforms.wh_inv, 1.0 / TEXTURE_WIDTH, 1.0 / TEXTURE_HEIGHT); gl.uniform2f(advectionProgram.uniforms.wh_inv, 1.0 / TEXTURE_WIDTH, 1.0 / TEXTURE_HEIGHT);
gl.uniform1f(advectionProgram.uniforms.dt, 1.0); gl.uniform1f(advectionProgram.uniforms.dt, 0.125);
gl.uniform1f(advectionProgram.uniforms.rdx, 1 / CELL_SIZE);
gl.uniform1f(advectionProgram.uniforms.dissipation, 1.0); gl.uniform1f(advectionProgram.uniforms.dissipation, 1.0);
blit(density.second[1]); blit(density.second[1]);
density.swap();
// calculate divergence // calculate divergence
divergenceProgram.bind(); divergenceProgram.bind();
gl.uniform1i(divergenceProgram.uniforms.uVelocity, velocity.first[2]); gl.uniform1i(divergenceProgram.uniforms.uVelocity, velocity.first[2]);
gl.uniform2f(divergenceProgram.uniforms.wh_inv, 1.0 / TEXTURE_WIDTH, 1.0 / TEXTURE_HEIGHT); gl.uniform2f(divergenceProgram.uniforms.wh_inv, 1.0 / TEXTURE_WIDTH, 1.0 / TEXTURE_HEIGHT);
gl.uniform1f(divergenceProgram.uniforms.halfrdx, 0.5 * (1 / CELL_SIZE)); gl.uniform1f(divergenceProgram.uniforms.halfrdx, 0.5 / CELL_SIZE);
blit(divergence[1]); blit(divergence[1]);
// pressure // pressure
clear(pressure.first[1]); clear(pressure.first[1]);
clear(pressure.second[1]); // clear(pressure.second[1]);
pressureProgram.bind(); pressureProgram.bind();
gl.uniform1i(pressureProgram.uniforms.uDivergence, divergence[2]); gl.uniform1i(pressureProgram.uniforms.uDivergence, divergence[2]);
gl.uniform2f(pressureProgram.uniforms.wh_inv, 1.0 / TEXTURE_WIDTH, 1.0 / TEXTURE_HEIGHT); gl.uniform2f(pressureProgram.uniforms.wh_inv, 1.0 / TEXTURE_WIDTH, 1.0 / TEXTURE_HEIGHT);
@@ -322,41 +330,20 @@ function Update () {
} }
// subtract gradient // subtract gradient
// gl.activeTexture(gl.TEXTURE0 + 0);
// gl.bindTexture(gl.TEXTURE_2D, pressure.second[0]);
// gl.activeTexture(gl.TEXTURE0 + 1);
// gl.bindTexture(gl.TEXTURE_2D, velocity.first[0]);
gradienSubtractProgram.bind(); gradienSubtractProgram.bind();
gl.uniform1i(gradienSubtractProgram.uniforms.uPressure, pressure.first[2]); gl.uniform1i(gradienSubtractProgram.uniforms.uPressure, pressure.first[2]);
gl.uniform1i(gradienSubtractProgram.uniforms.uVelocity, velocity.first[2]); gl.uniform1i(gradienSubtractProgram.uniforms.uVelocity, velocity.first[2]);
gl.uniform2f(gradienSubtractProgram.uniforms.wh_inv, 1.0 / TEXTURE_WIDTH, 1.0 / TEXTURE_HEIGHT); gl.uniform2f(gradienSubtractProgram.uniforms.wh_inv, 1.0 / TEXTURE_WIDTH, 1.0 / TEXTURE_HEIGHT);
gl.uniform1f(gradienSubtractProgram.uniforms.halfrdx, 0.5 * (1 / CELL_SIZE)); gl.uniform1f(gradienSubtractProgram.uniforms.halfrdx, 1.125 / CELL_SIZE);
blit(velocity.second[1]); blit(velocity.second[1]);
velocity.swap();
// advect velocity
// gl.activeTexture(gl.TEXTURE0 + 1);
// gl.bindTexture(gl.TEXTURE_2D, velocity.second[0]);
// blit(velocity.first[1]);
advectionProgram.bind();
gl.uniform1i(advectionProgram.uniforms.uVelocity, velocity.second[2]);
gl.uniform1i(advectionProgram.uniforms.uSource, velocity.second[2]);
gl.uniform2f(advectionProgram.uniforms.wh_inv, 1.0 / TEXTURE_WIDTH, 1.0 / TEXTURE_HEIGHT);
gl.uniform1f(advectionProgram.uniforms.dt, 1.0);
gl.uniform1f(advectionProgram.uniforms.rdx, 1 / CELL_SIZE);
gl.uniform1f(advectionProgram.uniforms.dissipation, 1.0);
blit(velocity.first[1]);
// display result // display result
gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight); gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
// gl.activeTexture(gl.TEXTURE0 + 0);
// gl.bindTexture(gl.TEXTURE_2D, density.first[0]);
displayProgram.bind(); displayProgram.bind();
gl.uniform1i(displayProgram.uniforms.uTexture, density.first[2]); gl.uniform1i(displayProgram.uniforms.uTexture, density.first[2]);
blit(null); blit(null);
density.swap();
velocity.swap();
requestAnimationFrame(Update); requestAnimationFrame(Update);
} }