/
demo.js
104 lines (85 loc) · 2.45 KB
/
demo.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
var triangle = require('a-big-triangle')
var loop = require('raf-loop')
var Texture = require('gl-texture2d')
var css = require('dom-css')
//get a shader
var glslify = require('glslify')
var createShader = glslify({
fragment: './shaders/blend.frag',
vertex: './shaders/blend.vert'
})
//create the testbed
var app = create({
shader: createShader,
width: 512,
height: 512
}).start()
var canvas = app.gl.canvas
//add to DOM
require('domready')(function() {
var body = document.body
css(body, 'margin', 0)
body.appendChild(canvas)
var info = body.appendChild(document.createElement('div'))
info.innerHTML = [
'<p>click the image to toggle</p>',
'<p>hover over it to animate the grain</p>'
].join('')
css(info, {
lineHeight: '3px',
marginLeft: 20,
fontFamily: '"Georgia", serif'
})
})
function create(opt) {
opt = opt || {}
//setup context & textures
var gl = require('webgl-context')(opt)
var shader = typeof opt.shader === 'function' ? opt.shader(gl) : opt.shader
//get a test image for our background
var image = require('lena').transpose(1, 0, 2)
var tex = Texture(gl, image)
var time = 0
var frame = 0
var effect = true
var hover = false
var app = loop(render)
app.gl = gl
//draw it initially
render(0)
//bind some controls
addEvents(gl.canvas)
return app
function render(dt) {
gl.clear(gl.COLOR_BUFFER_BIT)
gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight)
//set up uniforms
shader.bind()
shader.uniforms.resolution = [gl.drawingBufferWidth, gl.drawingBufferHeight]
shader.uniforms.background = 0
shader.uniforms.effect = effect ? 1 : 0
//film grain tends to look good when you update it
//every N milliseconds, instead of every frame
time += hover ? dt : 0
if (time > 54) {
frame += 0.1
time = 0
shader.uniforms.time = frame
}
//draw scene
tex.bind()
triangle(gl)
}
function addEvents(canvas) {
canvas.addEventListener('click', function(ev) {
ev.preventDefault()
effect = !effect
})
canvas.addEventListener('mouseover', function(ev) {
hover = true
})
canvas.addEventListener('mouseleave', function(ev) {
hover = false
})
}
}