Advertisement
Guest User

Untitled

a guest
May 14th, 2017
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. function createGLObjects(gl, myVBO, theirVBO, myTex, theirTex, texWidth)
  3. {
  4.     var fbo = gl.createFramebuffer();
  5.    
  6.    
  7.     gl.bindTexture(gl.TEXTURE_2D, myTex);
  8.     gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
  9.     gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
  10.     gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
  11.     gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
  12.     gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, texWidth, 1, 0, gl.RGBA, gl.FLOAT, null);
  13.     gl.bindTexture(gl.TEXTURE_2D, null);
  14.    
  15.     var rbo = gl.createRenderbuffer();
  16.    
  17.     gl.bindRenderbuffer(gl.RENDERBUFFER, rbo);
  18.     gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, texWidth, 1);
  19.     gl.bindRenderbuffer(gl.RENDERBUFFER, null);
  20.    
  21.     var tfo = gl.createTransformFeedback();
  22.    
  23.    
  24.     return {
  25.         vbo: myVBO,
  26.         tex: myTex,
  27.         rbo: rbo,
  28.         bind: function(program, positionTexLoc) {
  29.            
  30.             gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
  31.             gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, myTex, 0);
  32.             gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, rbo);
  33.            
  34.             gl.uniform1i(positionTexLoc, theirTex);
  35.            
  36.             gl.bindBuffer(gl.ARRAY_BUFFER, theirVBO);
  37.             gl.enableVertexAttribArray(0);
  38.             gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
  39.            
  40.             gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, tfo);
  41.             gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, myVBO);
  42.            
  43.             gl.beginTransformFeedback(gl.POINTS);
  44.         },
  45.         unbind: function(program, positionTexLoc) {
  46.            
  47.             gl.endTransformFeedback();
  48.            
  49.             gl.disableVertexAttribArray(0);
  50.             gl.bindBuffer(gl.ARRAY_BUFFER, null);
  51.            
  52.             gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, null);
  53.             gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, null);
  54.            
  55.             gl.uniform1i(positionTexLoc, 0);
  56.            
  57.             gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0);
  58.             gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, null);
  59.             gl.bindFramebuffer(gl.FRAMEBUFFER, null);
  60.         }
  61.     };
  62. }
  63.  
  64. function createSimGLObjects(gl, texWidth)
  65. {
  66.     var vbo0 = gl.createBuffer();
  67.     var vbo1 = gl.createBuffer();
  68.    
  69.     var tex0 = gl.createTexture();
  70.     var tex1 = gl.createTexture();
  71.    
  72.     return [
  73.         createGLObjects(gl, vbo0, vbo1, tex0, tex1, texWidth),
  74.         createGLObjects(gl, vbo1, vbo0, tex1, tex0, texWidth)
  75.     ];
  76. }
  77.  
  78. var run = function (gl, resources) {
  79.    
  80.  
  81.     var shaderProgram = initShaders(
  82.         gl,
  83.         resources["js/shaders/vertex.txt"],
  84.         resources["js/shaders/fragment.txt"]
  85.     );
  86.     var simProgram = initShaders(
  87.         gl,
  88.         resources["js/shaders/particlesim.vs"],
  89.         resources["js/shaders/particlesim.fs"],
  90.         ["tfVertexVelocity"]
  91.     );
  92.    
  93.     if(!shaderProgram)
  94.         return;
  95.    
  96.    
  97.     gl.clearColor(0.0, 0.0, 0.0, 1.0);
  98.    
  99.     gl.depthFunc(gl.LEQUAL);
  100.    
  101.     gl.disable(gl.CULL_FACE);
  102.  
  103.     var vbo = gl.createBuffer();
  104.     gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
  105.     gl.bufferData(
  106.         gl.ARRAY_BUFFER,
  107.         new Float32Array(
  108.             [
  109.                 0,0,0,1,
  110.                 1,1,0,1,
  111.                 1,0,0,1,
  112.             ]
  113.         ),
  114.         gl.STATIC_DRAW
  115.     );
  116.    
  117.     var modelMatLoc = gl.getUniformLocation(shaderProgram, "modelMat");
  118.     var viewMatLoc = gl.getUniformLocation(shaderProgram, "viewMat");
  119.     var projMatLoc = gl.getUniformLocation(shaderProgram, "projMat");
  120.    
  121.     var positionTexLoc = gl.getUniformLocation(simProgram, "positionTex");
  122.    
  123.     var t = 0.0;
  124.    
  125.     var particleCount = 1024;
  126.    
  127.     var positions = new Float32Array(particleCount * 4);
  128.    
  129.     var vboData = [];
  130.     for(var i = 0; i < particleCount; i++)
  131.     {
  132.         vboData.push(Math.random(), Math.random(), Math.random(), 1.0);
  133.     }
  134.     vboData = new Float32Array(vboData);
  135.    
  136.     var simObjects = createSimGLObjects(gl, particleCount);
  137.    
  138.     gl.bindTexture(gl.TEXTURE_2D, simObjects[1].tex);
  139.     gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, particleCount, 1, 0, gl.RGBA, gl.FLOAT, positions);
  140.     gl.bindTexture(gl.TEXTURE_2D, null);
  141.     gl.bindTexture(gl.TEXTURE_2D, simObjects[0].tex);
  142.     gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, particleCount, 1, 0, gl.RGBA, gl.FLOAT, positions);
  143.     gl.bindTexture(gl.TEXTURE_2D, null);
  144.    
  145.     gl.bindBuffer(gl.ARRAY_BUFFER, simObjects[1].vbo);
  146.     gl.bufferData(gl.ARRAY_BUFFER, vboData, gl.STATIC_DRAW);
  147.     gl.bindBuffer(gl.ARRAY_BUFFER, null);
  148.     gl.bindBuffer(gl.ARRAY_BUFFER, simObjects[0].vbo);
  149.     gl.bufferData(gl.ARRAY_BUFFER, vboData, gl.STATIC_DRAW);
  150.     gl.bindBuffer(gl.ARRAY_BUFFER, null);
  151.    
  152.     var update = function() {
  153.        
  154.         canvas.width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
  155.         canvas.height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
  156.        
  157.         gl.useProgram(simProgram);
  158.        
  159.         gl.disable(gl.DEPTH_TEST);
  160.        
  161.         //simulate tree
  162.         simObjects[0].bind(simProgram, positionTexLoc);
  163.        
  164.         gl.drawArrays(gl.POINTS, 0, particleCount);
  165.        
  166.         simObjects[0].unbind(simProgram, positionTexLoc);
  167.        
  168.         //swap GL objects
  169.         simObjects.push(simObjects.shift());
  170.        
  171.        
  172.         gl.enable(gl.DEPTH_TEST);
  173.        
  174.         //draw tree
  175.         gl.viewport(0, 0, window.innerWidth, window.innerHeight);
  176.         gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
  177.        
  178.         gl.useProgram(shaderProgram);
  179.        
  180.         var projMat = mat4.create();
  181.         mat4.perspective(projMat, Math.PI * 0.25, window.innerWidth / window.innerHeight, 0.01, 100.0);
  182.        
  183.         var orbitRadius = 5.0;
  184.         var height = 2.0;
  185.        
  186.         var angle = t * 0.1;
  187.        
  188.         var camPos = vec3.fromValues(Math.sin(angle) * orbitRadius, height, Math.cos(angle) * orbitRadius);
  189.         var camTarget = vec3.fromValues(0, 0, 0);
  190.         var up = vec3.fromValues(0, 1, 0);
  191.        
  192.         var viewMat = mat4.create();
  193.         //mat4.rotateX(viewMat, viewMat, Math.sin(t));
  194.         //mat4.translate(viewMat, viewMat, camPos);
  195.         mat4.lookAt(viewMat, camPos, camTarget, up);
  196.        
  197.         gl.uniformMatrix4fv(projMatLoc, false, projMat);
  198.         gl.uniformMatrix4fv(viewMatLoc, false, viewMat);
  199.        
  200.         gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
  201.         gl.enableVertexAttribArray(0);
  202.         gl.vertexAttribPointer(0, 4, gl.FLOAT, false, 0, 0);
  203.        
  204.         gl.drawArrays(gl.TRIANGLES, 0, 3);
  205.        
  206.         t += 0.0166666666;
  207.  
  208.         requestAnimationFrame(update);
  209.     };
  210.  
  211.     requestAnimationFrame(update);
  212. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement