Repository: codrops/ScrollSpiral Branch: master Commit: 3889131fea11 Files: 23 Total size: 73.6 KB Directory structure: gitextract_uisuplp9/ ├── .gitignore ├── README.md ├── css/ │ ├── demo.css │ └── normalize.css ├── index.html ├── index2.html ├── index3.html ├── index4.html ├── index5.html ├── index6.html ├── index7.html ├── index8.html ├── index9.html ├── js/ │ ├── demo1.js │ ├── demo2.js │ ├── demo3.js │ ├── demo4.js │ ├── demo5.js │ ├── demo6.js │ ├── demo7.js │ ├── demo8.js │ └── demo9.js └── psd/ └── gradient_map.psd ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ *.DS_Store # Windows thumbnail cache files Thumbs.db ehthumbs.db ehthumbs_vista.db # Folder config file Desktop.ini # Recycle Bin used on file shares $RECYCLE.BIN/ # Windows Installer files *.cab *.msi *.msm *.msp # Windows shortcuts *.lnk # Dropbox settings and caches .dropbox .dropbox.attr .dropbox.cache ================================================ FILE: README.md ================================================ # WebGL Scroll Spiral Some decorative background scroll effects for websites using WebGL and regl. By Xoihazard. ![WebGL Scroll Spiral](https://tympanus.net/codrops/wp-content/uploads/2017/04/WebGLScrollSpiral_800x600.jpg) [Article on Codrops](https://tympanus.net/codrops/?p=30761) [Demo](https://tympanus.net/Development/ScrollSpiral/) ## Credits - [Official regl website](http://regl.party) - Images copyright by [RuleByArt](https://creativemarket.com/RuleByArt?u=codrops). Purchase on Creative Market: [Flight](https://creativemarket.com/RuleByArt/468537-Flight?u=codrops) and [Surface Shapes](https://creativemarket.com/RuleByArt/32279-Surface-Shapes?u=codrops) ## License This resource can be used freely if integrated or build upon in personal or commercial projects such as websites, web apps and web templates intended for sale. It is not allowed to take the resource "as-is" and sell it, redistribute, re-publish it, or sell "pluginized" versions of it. Free plugins built using this resource should have a visible mention and link to the original work. Always consider the licenses of all included libraries, scripts and images used. ## Misc Follow Codrops: [Twitter](http://www.twitter.com/codrops), [Facebook](http://www.facebook.com/codrops), [Google+](https://plus.google.com/101095823814290637419), [GitHub](https://github.com/codrops), [Pinterest](http://www.pinterest.com/codrops/), [Instagram](https://www.instagram.com/codropsss/) [© Codrops 2017](http://www.codrops.com) ================================================ FILE: css/demo.css ================================================ *, *::after, *::before { box-sizing: border-box; } body { font-family: 'Roboto Mono', monospace; color: #fff; background: #000; } a { text-decoration: none; color: #fff; outline: none; } a:hover, a:focus { color: #fff; } .hidden { position: absolute; overflow: hidden; width: 0; height: 0; pointer-events: none; } /* Overlay */ main::before { content: ''; position: fixed; z-index: -1; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; background: rgba(0,0,0,0.4); } /* Icons */ .icon { display: block; width: 1.5em; height: 1.5em; margin: 0 auto; fill: currentColor; } /* Page Loader */ .js .loading::before { content: ''; position: fixed; z-index: 1000; top: 0; left: 0; width: 100%; height: 100%; background: #000; } .js .loading::after { content: ''; position: fixed; z-index: 1001; top: 50%; left: 50%; width: 50px; height: 50px; margin: -25px 0 0 -25px; pointer-events: none; border-radius: 50%; background: #3b3b3b; animation: loaderAnim 0.8s ease-out infinite alternate forwards; } @keyframes loaderAnim { to { transform: scale3d(0.5,0.5,1); } } .content { display: flex; flex-wrap: wrap; min-height: 100vh; } .content--main { min-height: 500vh; } .content--main::before, .content--main::after { position: fixed; left: 50%; } .content--main::before { content: ''; bottom: 3em; height: 1.5em; width: 1px; background: #fff; } .content--main::after { content: 'Scroll'; position: fixed; bottom: 0; width: 6em; text-align: center; margin: 0 0 1.5em -3em; font-size: 0.75em; text-transform: uppercase; letter-spacing: 2px; text-indent: 2px; } .content--header { position: relative; z-index: 11; align-items: flex-start; width: 100%; padding: 1.5em; } .content__top { display: flex; flex-direction: row; flex-wrap: wrap; align-items: center; width: 100%; } .main-title { font-size: 1em; font-weight: normal; margin: 0; padding: 0; } .main-tagline { font-size: 0.865em; margin: 0 1em; opacity: 0.8; } .main-tagline::before, .main-tagline::after { content: ' // '; } .github { font-size: 0.865em; } /* Top Navigation Style */ .codrops-links { position: relative; display: flex; justify-content: center; margin: 0 0 0 auto; text-align: center; white-space: nowrap; } .codrops-icon { display: inline-block; margin: 0.25em; padding: 0.5em; } /* Demo links */ .demos { position: fixed; top: 6em; left: 0; display: flex; flex-direction: column; align-items: flex-start; padding: 0 1.25em; } .demo { font-size: 0.865em; position: relative; margin: 0 1em 0.5em 0; padding: 0 0 0.25em 0.25em; white-space: nowrap; } .demo:hover, .demo--current { text-decoration: underline; } /* Related demos */ .content--related { position: relative; z-index: 10; justify-content: center; padding: 3em 1.5em; text-align: center; background: #000; align-content: center; } .content--related a, .github { text-decoration: underline; } .content--related a:hover, .content--related a:focus, .github:hover, .github:focus { text-decoration: none; } .content__text { font-size: 0.865em; font-weight: normal; width: 100%; margin: 0 0 1em 0; } .content__text:first-child { margin: 0 0 5em 0; } .media-item { display: inline-block; padding: 1em; vertical-align: top; transition: color 0.3s; } .media-item__img { max-width: 100%; opacity: 0.6; transition: opacity 0.3s; } .media-item:hover .media-item__img, .media-item:focus .media-item__img { opacity: 1; } .media-item__title { font-size: 0.865em; font-weight: normal; max-width: 200px; margin: 0; padding: 0.5em; } #webgl { position: fixed; z-index: -1; top: 0; left: 0; display: block; width: 100vw; height: 100vh; } /* Colors for demos */ /* Demo 2 */ .demo-2 { background: #5ae6ae; } .demo-2 main::before { background: rgba(60, 145, 110, 0.3); } .demo-2 .content--related { background: #5ae6ae; } /* Demo 3 */ .demo-3 { background: #d8d9cd; } .demo-3 main::before { background: rgba(169, 175, 66, 0.3); } .demo-3 .content--related { background: #d8d9cd; } /* Demo 4 */ .demo-4 { background: #babed1; } .demo-4 main::before { background: rgba(175, 179, 194, 0.3); } .demo-4 .content--related { background: #babed1; } /* Demo 5 */ .demo-5 { background: #000; } .demo-5 main::before { background: rgba(0,0,0,0.4); } .demo-5 .content--related { background: #000; } /* Demo 6 */ .demo-6 { background: #e8dac5; } .demo-6 main::before { background: rgba(0, 0, 0, 0.3); } .demo-6 .content--related { background: #e8dac5; } /* Demo 7 */ .demo-7 { background: #000; } .demo-7 main::before { background: rgba(0, 0, 0, 0.6); } .demo-7 .content--related { background: #000; } /* Demo 8 */ .demo-8 { background: #232121; } .demo-8 main::before { background: rgba(84, 115, 243, 0.3); } .demo-8 .content--related { background: #232121; } /* Demo 9 */ .demo-9 { background: #232121; } .demo-9 main::before { background: rgba(0, 0, 0, 0.3); } .demo-9 .content--related { background: #2a2acf; } @media screen and (max-width: 40em) { .content--header { padding: 1em 0.5em 0; } .content__top { display: block; text-align: center; } .main-tagline { margin: 0; } .demos { position: relative; width: 100%; margin: 0; padding: 0.5em; transform: none; top: auto; display: block; } } ================================================ FILE: css/normalize.css ================================================ article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block;}audio,canvas,video{display:inline-block;}audio:not([controls]){display:none;height:0;}[hidden]{display:none;}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;}body{margin:0;}a:focus{outline:thin dotted;}a:active,a:hover{outline:0;}h1{font-size:2em;margin:0.67em 0;}abbr[title]{border-bottom:1px dotted;}b,strong{font-weight:bold;}dfn{font-style:italic;}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0;}mark{background:#ff0;color:#000;}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em;}pre{white-space:pre-wrap;}q{quotes:"\201C" "\201D" "\2018" "\2019";}small{font-size:80%;}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;}sup{top:-0.5em;}sub{bottom:-0.25em;}img{border:0;}svg:not(:root){overflow:hidden;}figure{margin:0;}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em;}legend{border:0;padding:0;}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0;}button,input{line-height:normal;}button,select{text-transform:none;}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;}button[disabled],html input[disabled]{cursor:default;}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none;}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0;}textarea{overflow:auto;vertical-align:top;}table{border-collapse:collapse;border-spacing:0;} ================================================ FILE: index.html ================================================ WebGL Scroll Spiral | Demo 1 | Codrops

Scroll Spirals

Decorative Background Effects with WebGL

GitHub
================================================ FILE: index2.html ================================================ WebGL Scroll Spiral | Demo 2 | Codrops

Scroll Spirals

Decorative Background Effects with WebGL

GitHub
================================================ FILE: index3.html ================================================ WebGL Scroll Spiral | Demo 2 | Codrops

Scroll Spirals

Decorative Background Effects with WebGL

GitHub
================================================ FILE: index4.html ================================================ WebGL Scroll Spiral | Demo 2 | Codrops

Scroll Spirals

Decorative Background Effects with WebGL

GitHub
================================================ FILE: index5.html ================================================ WebGL Scroll Spiral | Demo 2 | Codrops

Scroll Spirals

Decorative Background Effects with WebGL

GitHub
================================================ FILE: index6.html ================================================ WebGL Scroll Spiral | Demo 3 | Codrops

Scroll Spirals

Decorative Background Effects with WebGL

GitHub
================================================ FILE: index7.html ================================================ WebGL Scroll Spiral | Demo 3 | Codrops

Scroll Spirals

Decorative Background Effects with WebGL

GitHub
================================================ FILE: index8.html ================================================ WebGL Scroll Spiral | Demo 3 | Codrops

Scroll Spirals

Decorative Background Effects with WebGL

GitHub
================================================ FILE: index9.html ================================================ WebGL Scroll Spiral | Demo 1 | Codrops

Scroll Spirals

Decorative Background Effects with WebGL

GitHub
================================================ FILE: js/demo1.js ================================================ !function() { 'use strict'; var canvas = document.querySelector('#webgl'); // Scroll variables var scroll = 0.0, velocity = 0.0, lastScroll = 0.0; // initialize REGL from a canvas element var regl = createREGL({ canvas: canvas, onDone: function(error, regl) { if (error) { alert(error); } } }); // Create a REGL draw command var draw = regl({ frag: document.querySelector('#fragmentShader').textContent, vert: 'attribute vec2 position; void main() { gl_Position = vec4(3.0 * position, 0.0, 1.0); }', attributes: { position: [-1, 0, 0, -1, 1, 1] }, count: 3, uniforms: { globaltime: regl.prop('globaltime'), resolution: regl.prop('resolution'), aspect: regl.prop('aspect'), scroll: regl.prop('scroll'), velocity: regl.prop('velocity') } }); // Hook a callback to execute each frame regl.frame(function(ctx) { // Resize a canvas element with the aspect ratio (100vw, 100vh) var aspect = canvas.scrollWidth / canvas.scrollHeight; canvas.width = 512 * aspect; canvas.height = 512; // Scroll amount (0.0 to 1.0) scroll = window.pageYOffset / (document.documentElement.scrollHeight - window.innerHeight); // Scroll velocity // Inertia example: // velocity = velocity * 0.99 + (scroll - lastScroll); // lastScroll = scroll; // Clear the draw buffer regl.clear({ color: [0, 0, 0, 0] }); // Execute a REGL draw command draw({ globaltime: ctx.time, resolution: [ctx.viewportWidth, ctx.viewportHeight], aspect: aspect, scroll: scroll, velocity: velocity }); }); setTimeout(function() { document.body.classList.remove('loading');}, 1000); }(); ================================================ FILE: js/demo2.js ================================================ !function() { 'use strict'; var canvas = document.querySelector('#webgl'); // Scroll variables var scroll = 0.0, velocity = 0.0, lastScroll = 0.0; // Initialize REGL from a canvas element var regl = createREGL({ canvas: canvas, onDone: function(error, regl) { if (error) { alert(error); } } }); // Loading a texture var img = new Image(); img.src = 'img/img1.jpg'; img.onload = function() { setTimeout(function() { document.body.classList.remove('loading');}, 1000); // Create a REGL draw command var draw = regl({ frag: document.querySelector('#fragmentShader').textContent, vert: 'attribute vec2 position; void main() { gl_Position = vec4(3.0 * position, 0.0, 1.0); }', attributes: { position: [-1, 0, 0, -1, 1, 1] }, count: 3, uniforms: { globaltime: regl.prop('globaltime'), resolution: regl.prop('resolution'), aspect: regl.prop('aspect'), scroll: regl.prop('scroll'), velocity: regl.prop('velocity'), texture: regl.texture(img) } }); // Hook a callback to execute each frame regl.frame(function(ctx) { // Resize a canvas element with the aspect ratio (100vw, 100vh) var aspect = canvas.scrollWidth / canvas.scrollHeight; canvas.width = 1024 * aspect; canvas.height = 1024; // Scroll amount (0.0 to 1.0) scroll = window.pageYOffset / (document.documentElement.scrollHeight - window.innerHeight); // Scroll Velocity // Inertia example: // velocity = velocity * 0.99 + (scroll - lastScroll); // lastScroll = scroll; // Clear the draw buffer regl.clear({ color: [0, 0, 0, 0] }); // Execute a REGL draw command draw({ globaltime: ctx.time, resolution: [ctx.viewportWidth, ctx.viewportHeight], aspect: aspect, scroll: scroll, velocity: velocity }); }); }; }(); ================================================ FILE: js/demo3.js ================================================ !function() { 'use strict'; var canvas = document.querySelector('#webgl'); // Scroll variables var scroll = 0.0, velocity = 0.0, lastScroll = 0.0; // Initialize REGL from a canvas element var regl = createREGL({ canvas: canvas, onDone: function(error, regl) { if (error) { alert(error); } } }); // Loading a texture var img = new Image(); img.src = 'img/img2.jpg'; img.onload = function() { setTimeout(function() { document.body.classList.remove('loading');}, 1000); // Create a REGL draw command var draw = regl({ frag: document.querySelector('#fragmentShader').textContent, vert: 'attribute vec2 position; void main() { gl_Position = vec4(3.0 * position, 0.0, 1.0); }', attributes: { position: [-1, 0, 0, -1, 1, 1] }, count: 3, uniforms: { globaltime: regl.prop('globaltime'), resolution: regl.prop('resolution'), aspect: regl.prop('aspect'), scroll: regl.prop('scroll'), velocity: regl.prop('velocity'), texture: regl.texture(img) } }); // Hook a callback to execute each frame regl.frame(function(ctx) { // Resize a canvas element with the aspect ratio (100vw, 100vh) var aspect = canvas.scrollWidth / canvas.scrollHeight; canvas.width = 1024 * aspect; canvas.height = 1024; // Scroll amount (0.0 to 1.0) scroll = window.pageYOffset / (document.documentElement.scrollHeight - window.innerHeight); // Scroll Velocity // Inertia example: // velocity = velocity * 0.99 + (scroll - lastScroll); // lastScroll = scroll; // Clear the draw buffer regl.clear({ color: [0, 0, 0, 0] }); // Execute a REGL draw command draw({ globaltime: ctx.time, resolution: [ctx.viewportWidth, ctx.viewportHeight], aspect: aspect, scroll: scroll, velocity: velocity }); }); }; }(); ================================================ FILE: js/demo4.js ================================================ !function() { 'use strict'; var canvas = document.querySelector('#webgl'); // Scroll variables var scroll = 0.0, velocity = 0.0, lastScroll = 0.0; // Initialize REGL from a canvas element var regl = createREGL({ canvas: canvas, onDone: function(error, regl) { if (error) { alert(error); } } }); // Loading a texture var img = new Image(); img.src = 'img/img3.jpg'; img.onload = function() { setTimeout(function() { document.body.classList.remove('loading');}, 1000); // Create a REGL draw command var draw = regl({ frag: document.querySelector('#fragmentShader').textContent, vert: 'attribute vec2 position; void main() { gl_Position = vec4(3.0 * position, 0.0, 1.0); }', attributes: { position: [-1, 0, 0, -1, 1, 1] }, count: 3, uniforms: { globaltime: regl.prop('globaltime'), resolution: regl.prop('resolution'), aspect: regl.prop('aspect'), scroll: regl.prop('scroll'), velocity: regl.prop('velocity'), texture: regl.texture(img) } }); // Hook a callback to execute each frame regl.frame(function(ctx) { // Resize a canvas element with the aspect ratio (100vw, 100vh) var aspect = canvas.scrollWidth / canvas.scrollHeight; canvas.width = 1024 * aspect; canvas.height = 1024; // Scroll amount (0.0 to 1.0) scroll = window.pageYOffset / (document.documentElement.scrollHeight - window.innerHeight); // Scroll Velocity // Inertia example: // velocity = velocity * 0.99 + (scroll - lastScroll); // lastScroll = scroll; // Clear the draw buffer regl.clear({ color: [0, 0, 0, 0] }); // Execute a REGL draw command draw({ globaltime: ctx.time, resolution: [ctx.viewportWidth, ctx.viewportHeight], aspect: aspect, scroll: scroll, velocity: velocity }); }); }; }(); ================================================ FILE: js/demo5.js ================================================ !function() { 'use strict'; var canvas = document.querySelector('#webgl'); // Scroll variables var scroll = 0.0, velocity = 0.0, lastScroll = 0.0; // Initialize REGL from a canvas element var regl = createREGL({ canvas: canvas, onDone: function(error, regl) { if (error) { alert(error); } } }); // Loading a texture var img = new Image(); img.src = 'img/img4.jpg'; img.onload = function() { setTimeout(function() { document.body.classList.remove('loading');}, 1000); // Create a REGL draw command var draw = regl({ frag: document.querySelector('#fragmentShader').textContent, vert: 'attribute vec2 position; void main() { gl_Position = vec4(3.0 * position, 0.0, 1.0); }', attributes: { position: [-1, 0, 0, -1, 1, 1] }, count: 3, uniforms: { globaltime: regl.prop('globaltime'), resolution: regl.prop('resolution'), aspect: regl.prop('aspect'), scroll: regl.prop('scroll'), velocity: regl.prop('velocity'), texture: regl.texture(img) } }); // Hook a callback to execute each frame regl.frame(function(ctx) { // Resize a canvas element with the aspect ratio (100vw, 100vh) var aspect = canvas.scrollWidth / canvas.scrollHeight; canvas.width = 1024 * aspect; canvas.height = 1024; // Scroll amount (0.0 to 1.0) scroll = window.pageYOffset / (document.documentElement.scrollHeight - window.innerHeight); // Scroll Velocity // Inertia example: // velocity = velocity * 0.99 + (scroll - lastScroll); // lastScroll = scroll; // Clear the draw buffer regl.clear({ color: [0, 0, 0, 0] }); // Execute a REGL draw command draw({ globaltime: ctx.time, resolution: [ctx.viewportWidth, ctx.viewportHeight], aspect: aspect, scroll: scroll, velocity: velocity }); }); }; }(); ================================================ FILE: js/demo6.js ================================================ !function() { 'use strict'; var canvas = document.querySelector('#webgl'); // Scroll variables var scroll = 0.0, velocity = 0.0, lastScroll = 0.0; // initialize REGL from a canvas element var regl = createREGL({ canvas: canvas, onDone: function(error, regl) { if (error) { alert(error); } } }); // Loading a texture var img = new Image(); img.src = 'img/gradient_map1.png'; img.onload = function() { setTimeout(function() { document.body.classList.remove('loading');}, 1000); // Create a REGL draw command var draw = regl({ frag: document.querySelector('#fragmentShader').textContent, vert: 'attribute vec2 position; void main() { gl_Position = vec4(3.0 * position, 0.0, 1.0); }', attributes: { position: [-1, 0, 0, -1, 1, 1] }, count: 3, uniforms: { globaltime: regl.prop('globaltime'), resolution: regl.prop('resolution'), aspect: regl.prop('aspect'), scroll: regl.prop('scroll'), velocity: regl.prop('velocity'), gradient: regl.texture(img) } }); // Hook a callback to execute each frame regl.frame(function(ctx) { // Resize a canvas element with the aspect ratio (100vw, 100vh) var aspect = canvas.scrollWidth / canvas.scrollHeight; canvas.width = 768 * aspect; canvas.height = 768; // Scroll amount (0.0 to 1.0) scroll = window.pageYOffset / (document.documentElement.scrollHeight - window.innerHeight); // Scroll Velocity // Inertia example: // velocity = velocity * 0.99 + (scroll - lastScroll); // lastScroll = scroll; // Clear the draw buffer regl.clear({ color: [0, 0, 0, 0] }); // Execute a REGL draw command draw({ globaltime: ctx.time, resolution: [ctx.viewportWidth, ctx.viewportHeight], aspect: aspect, scroll: scroll, velocity: velocity }); }); }; }(); ================================================ FILE: js/demo7.js ================================================ !function() { 'use strict'; var canvas = document.querySelector('#webgl'); // Scroll variables var scroll = 0.0, velocity = 0.0, lastScroll = 0.0; // initialize REGL from a canvas element var regl = createREGL({ canvas: canvas, onDone: function(error, regl) { if (error) { alert(error); } } }); // Loading a texture var img = new Image(); img.src = 'img/gradient_map2.png'; img.onload = function() { setTimeout(function() { document.body.classList.remove('loading');}, 1000); // Create a REGL draw command var draw = regl({ frag: document.querySelector('#fragmentShader').textContent, vert: 'attribute vec2 position; void main() { gl_Position = vec4(3.0 * position, 0.0, 1.0); }', attributes: { position: [-1, 0, 0, -1, 1, 1] }, count: 3, uniforms: { globaltime: regl.prop('globaltime'), resolution: regl.prop('resolution'), aspect: regl.prop('aspect'), scroll: regl.prop('scroll'), velocity: regl.prop('velocity'), gradient: regl.texture(img) } }); // Hook a callback to execute each frame regl.frame(function(ctx) { // Resize a canvas element with the aspect ratio (100vw, 100vh) var aspect = canvas.scrollWidth / canvas.scrollHeight; canvas.width = 768 * aspect; canvas.height = 768; // Scroll amount (0.0 to 1.0) scroll = window.pageYOffset / (document.documentElement.scrollHeight - window.innerHeight); // Scroll Velocity // Inertia example: // velocity = velocity * 0.99 + (scroll - lastScroll); // lastScroll = scroll; // Clear the draw buffer regl.clear({ color: [0, 0, 0, 0] }); // Execute a REGL draw command draw({ globaltime: ctx.time, resolution: [ctx.viewportWidth, ctx.viewportHeight], aspect: aspect, scroll: scroll, velocity: velocity }); }); }; }(); ================================================ FILE: js/demo8.js ================================================ !function() { 'use strict'; var canvas = document.querySelector('#webgl'); // Scroll variables var scroll = 0.0, velocity = 0.0, lastScroll = 0.0; // initialize REGL from a canvas element var regl = createREGL({ canvas: canvas, onDone: function(error, regl) { if (error) { alert(error); } } }); // Loading a texture var img = new Image(); img.src = 'img/gradient_map3.png'; img.onload = function() { setTimeout(function() { document.body.classList.remove('loading');}, 1000); // Create a REGL draw command var draw = regl({ frag: document.querySelector('#fragmentShader').textContent, vert: 'attribute vec2 position; void main() { gl_Position = vec4(3.0 * position, 0.0, 1.0); }', attributes: { position: [-1, 0, 0, -1, 1, 1] }, count: 3, uniforms: { globaltime: regl.prop('globaltime'), resolution: regl.prop('resolution'), aspect: regl.prop('aspect'), scroll: regl.prop('scroll'), velocity: regl.prop('velocity'), gradient: regl.texture(img) } }); // Hook a callback to execute each frame regl.frame(function(ctx) { // Resize a canvas element with the aspect ratio (100vw, 100vh) var aspect = canvas.scrollWidth / canvas.scrollHeight; canvas.width = 768 * aspect; canvas.height = 768; // Scroll amount (0.0 to 1.0) scroll = window.pageYOffset / (document.documentElement.scrollHeight - window.innerHeight); // Scroll Velocity // Inertia example: // velocity = velocity * 0.99 + (scroll - lastScroll); // lastScroll = scroll; // Clear the draw buffer regl.clear({ color: [0, 0, 0, 0] }); // Execute a REGL draw command draw({ globaltime: ctx.time, resolution: [ctx.viewportWidth, ctx.viewportHeight], aspect: aspect, scroll: scroll, velocity: velocity }); }); }; }(); ================================================ FILE: js/demo9.js ================================================ !function() { 'use strict'; var canvas = document.querySelector('#webgl'); // Scroll variables var scroll = 0.0, velocity = 0.0, lastScroll = 0.0; // initialize REGL from a canvas element var regl = createREGL({ canvas: canvas, onDone: function(error, regl) { if (error) { alert(error); } } }); // Create a REGL draw command var draw = regl({ frag: document.querySelector('#fragmentShader').textContent, vert: 'attribute vec2 position; void main() { gl_Position = vec4(3.0 * position, 0.0, 1.0); }', attributes: { position: [-1, 0, 0, -1, 1, 1] }, count: 3, uniforms: { globaltime: regl.prop('globaltime'), resolution: regl.prop('resolution'), aspect: regl.prop('aspect'), scroll: regl.prop('scroll'), velocity: regl.prop('velocity') } }); // Hook a callback to execute each frame regl.frame(function(ctx) { // Resize a canvas element with the aspect ratio (100vw, 100vh) var aspect = canvas.scrollWidth / canvas.scrollHeight; canvas.width = 512 * aspect; canvas.height = 512; // Scroll amount (0.0 to 1.0) scroll = window.pageYOffset / (document.documentElement.scrollHeight - window.innerHeight); // Scroll Velocity // Inertia example: // velocity = velocity * 0.99 + (scroll - lastScroll); // lastScroll = scroll; // Clear the draw buffer regl.clear({ color: [0, 0, 0, 0] }); // Execute a REGL draw command draw({ globaltime: ctx.time, resolution: [ctx.viewportWidth, ctx.viewportHeight], aspect: aspect, scroll: scroll, velocity: velocity }); }); setTimeout(function() { document.body.classList.remove('loading');}, 1000); }();