1 | 'use strict'
|
2 |
|
3 | var glslify = require('glslify')
|
4 | var drawTriangle = require('a-big-triangle')
|
5 |
|
6 | var createShader = glslify({
|
7 | vert: '\
|
8 | attribute vec2 position;\
|
9 | varying vec2 uv;\
|
10 | void main() {\
|
11 | uv = position;\
|
12 | gl_Position = vec4(position,0,1);\
|
13 | }',
|
14 | frag: '\
|
15 | precision mediump float;\n\
|
16 | #pragma glslify: specular = require(../index.glsl)\n\
|
17 | varying vec2 uv;\n\
|
18 | uniform vec3 lightPosition;\n\
|
19 | void main() {\n\
|
20 | float r = sqrt(dot(uv,uv));\
|
21 | float theta = atan(uv.y,uv.x);\
|
22 | float phi = asin(r);\
|
23 | vec3 normal = vec3(\
|
24 | cos(theta)*sin(phi),\
|
25 | sin(theta)*sin(phi),\
|
26 | -cos(phi));\n\
|
27 | vec3 position = vec3(normal.xy, normal.z+5.0);\
|
28 | vec3 lightDir = normalize(lightPosition - position);\
|
29 | vec3 eyeDir = normalize(-position);\
|
30 | float power = specular(lightDir, eyeDir, normal, 0.1);\n\
|
31 | if(r > 1.0) {\n\
|
32 | gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);\n\
|
33 | } else {\n\
|
34 | gl_FragColor = vec4(power,power,power, 1.0);\n\
|
35 | }\n\
|
36 | }',
|
37 | inline: true
|
38 | })
|
39 |
|
40 | var canvas = document.createElement('canvas')
|
41 | canvas.width = window.innerWidth
|
42 | canvas.height = window.innerHeight
|
43 | canvas.style.left = "0px"
|
44 | canvas.style.top = "0px"
|
45 | canvas.style.position = "absolute"
|
46 | document.body.appendChild(canvas)
|
47 |
|
48 | var gl = canvas.getContext('webgl')
|
49 | var shader = createShader(gl)
|
50 |
|
51 | function render() {
|
52 | shader.bind()
|
53 | var theta = Date.now()*0.0005
|
54 | var x = Math.cos(theta)
|
55 | var y = Math.sin(theta)
|
56 | shader.uniforms.lightPosition = [30.0*x, 10.0, 30.0*y]
|
57 | drawTriangle(gl)
|
58 | requestAnimationFrame(render)
|
59 | }
|
60 |
|
61 | render() |
\ | No newline at end of file |