Просмотр исходного кода

librarize the renderer

it's a function that takes the canvas and a fragment shader as an
argument, and returns an object with a `.render()` method and exposes
several webgl related fields (`.gl`, `.program`, ...).
Lucas Stadler лет назад: 10
Родитель
Сommit
dd4abe2414
1 измененных файлов с 71 добавлено и 58 удалено
  1. 71 58
      glsl/raymarching.js

+ 71 - 58
glsl/raymarching.js

@ -209,79 +209,92 @@ void main() {
209 209
}
210 210
  `
211 211
  document.head.appendChild(styleEl);
212
213
  var canvas = document.createElement("canvas");
214
  var w = canvas.width = window.innerWidth;
215
  var h = canvas.height = window.innerHeight;
216
  document.body.appendChild(canvas);
217
218
  var gl = canvas.getContext("webgl");
219
  if (!gl) { alert("i think your browser does not support webgl"); }
220
221
  gl.clearColor(0.0, 0.0, 0.0, 1.0);
222
  gl.clear(gl.COLOR_BUFFER_BIT);
223 212
  
224
  var vertexShader = compileShader(gl, gl.VERTEX_SHADER, vertexShaderSrc);
225
  var fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSrc);
226
  
227
  var program = linkShaders(gl, vertexShader, fragmentShader);
228
  gl.useProgram(program);
229
  
230
  var aPosition = gl.getAttribLocation(program, 'aPosition');
231
  var iResolution = gl.getUniformLocation(program, 'iResolution');
232
  var iGlobalTime = gl.getUniformLocation(program, 'iGlobalTime');
233
  var iMouse = gl.getUniformLocation(program, 'iMouse');
234
  
235
  gl.vertexAttrib2f(aPosition, 0.0, 0.0);
236
  gl.uniform2f(iResolution, canvas.width, canvas.height);
237
  gl.uniform1f(iGlobalTime, 0.0);
238
  gl.uniform3f(iMouse, 0.0, 0.0, 0.0);
239
  
240
  // two triangles
241
  var positions = new Float32Array([
242
    -1.0, 1.0,
243
    -1.0, -1.0,
244
    1.0, 1.0,
213
  function TwoTriangles(canvas, fragmentShaderSrc) {
214
    var tt = {};
215
    tt.canvas = canvas;
216
    tt.fragmentShaderSrc = fragmentShaderSrc;
245 217
    
246
    1.0, 1.0,
247
    -1.0, -1.0,
248
    1.0, -1.0
249
  ]);
250
  initBuffer(gl, positions, 2, aPosition);
251
  
252
  function render() {
253
   gl.drawArrays(gl.TRIANGLES, 0, 6);
218
    tt.w = canvas.width = window.innerWidth;
219
    tt.h = canvas.height = window.innerHeight;
220
221
    var gl = tt.gl = canvas.getContext("webgl");
222
    if (!gl) { alert("i think your browser does not support webgl"); }
223
224
    gl.clearColor(0.0, 0.0, 0.0, 1.0);
225
    gl.clear(gl.COLOR_BUFFER_BIT);
226
227
    var vertexShader = compileShader(gl, gl.VERTEX_SHADER, vertexShaderSrc);
228
    var fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSrc);
229
230
    var program = tt.program = linkShaders(gl, vertexShader, fragmentShader);
231
    gl.useProgram(program);
232
233
    var aPosition = gl.getAttribLocation(program, 'aPosition');
234
    var iResolution = gl.getUniformLocation(program, 'iResolution');
235
    var iGlobalTime = gl.getUniformLocation(program, 'iGlobalTime');
236
    var iMouse = gl.getUniformLocation(program, 'iMouse');
237
238
    gl.vertexAttrib2f(aPosition, 0.0, 0.0);
239
    gl.uniform2f(iResolution, canvas.width, canvas.height);
240
    gl.uniform1f(iGlobalTime, 0.0);
241
    gl.uniform3f(iMouse, 0.0, 0.0, 0.0);
242
243
    // two triangles
244
    var positions = new Float32Array([
245
      -1.0, 1.0,
246
      -1.0, -1.0,
247
      1.0, 1.0,
248
249
      1.0, 1.0,
250
      -1.0, -1.0,
251
      1.0, -1.0
252
    ]);
253
    initBuffer(gl, positions, 2, aPosition);
254
255
    tt.render = function() {
256
      gl.drawArrays(gl.TRIANGLES, 0, 6);
257
    };
258
    
259
    tt.draw = function() {
260
      requestAnimationFrame(draw);
261
      render();
262
    }
263
    
264
    tt.canvas.addEventListener("mousemove", function(ev) {
265
      gl.uniform3f(iMouse, ev.mouseX, ev.mouseY, 0.0);
266
    });
267
    
268
      
269
    window.onresize = function(ev) {
270
      tt.w = tt.canvas.width = window.innerWidth;
271
      tt.h = tt.canvas.height = window.innerHeight;
272
      gl.viewport(0, 0, tt.w, tt.h);
273
      gl.uniform2f(iResolution, tt.w, tt.h);
274
      tt.render();
275
    };
276
    
277
    tt.render();
278
    return tt;
254 279
  }
255 280
  
256
  document.body.addEventListener("mousemove", function(ev) {
257
    gl.uniform3f(iMouse, ev.mouseX, ev.mouseY, 0.0);
258
  });
259
  
260
  function draw() {
261
    requestAnimationFrame(draw);
262
    render();
263
  }
281
  var canvas = document.createElement("canvas");
282
  document.body.appendChild(canvas);
264 283
  
265
  window.onresize = function(ev) {
266
    w = canvas.width = window.innerWidth;
267
    h = canvas.height = window.innerHeight;
268
    gl.viewport(0, 0, w, h);
269
    gl.uniform2f(iResolution, w, h);
270
    render();
271
  };
284
  var tt = TwoTriangles(canvas, fragmentShaderSrc);
272 285
273 286
  var sidebarEl = document.createElement("div");
274 287
  sidebarEl.id = "sidebar";
275 288
  document.body.appendChild(sidebarEl);
276 289
  
277 290
  var sliders = findSliders(fragmentShaderSrc);
278
  initSliders(gl, program, sliders, function(ev) {
279
    requestAnimationFrame(render);
291
  initSliders(tt.gl, tt.program, sliders, function(ev) {
292
    requestAnimationFrame(tt.render);
280 293
  });
281 294
  
282 295
  addSliders(sidebarEl, sliders);
283 296
  
284
  render();
297
  tt.render();
285 298
} catch (e) {
286 299
  window.error = e;
287 300
  var msg = document.createElement("pre");