|
|
@ -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");
|