GLSL sandbox (fullscreen)
to create original (fullscreen) effects
by Wai Ting Chen
HTML
<script src="http://mrdoob.github.com/three.js/build/three.min.js"></script>
<script id="vertexShader" type="x-shader/x-vertex">
void main() {
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
</script>
<script id="fragmentShader" type="x-shader/x-fragment">
uniform float time;
float rand(vec2 co) {
return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);
}
void main(void) {
// Divide the coordinates into a grid of squares
vec2 v = gl_FragCoord.xy / 20.0;
// Calculate a pseudo-random brightness value for each square
vec3 brightness = vec3(fract(rand(floor(v)) + time), fract(rand(floor(v)) + time / 3.), fract(rand(floor(v)) + time / 5.));
// Reduce brightness in pixels away from the square center
brightness *= 0.5 - length(fract(v) - vec2(0.5, 0.5));
gl_FragColor = vec4(brightness.r * 4.0, brightness.g * brightness.b * 2., brightness.b - brightness.r + 0.2, 1.0);
}
</script>
CSS
body {
overflow:hidden;
}
JavaScript
var camera, scene, renderer;
var clock = new THREE.Clock();
var meshMaterial;
init();
animate();
function init() {
/*
camera = new THREE.PerspectiveCamera(40, window.innerWidth / window.innerHeight, 1, 3000);
camera.position.z = 500;
*/
// orthographic camera (for full-screen plane)
camera = new THREE.OrthographicCamera(-100, 100, 100, -100, -500, 500);
camera.position.z = 300;
var geometry = new THREE.PlaneGeometry(200, 200);
meshMaterial = new THREE.ShaderMaterial({
uniforms: {
time: {
type: 'f',
value: 1.0
}
},
vertexShader: document.getElementById('vertexShader').textContent,
fragmentShader: document.getElementById('fragmentShader').textContent
});
var mesh = new THREE.Mesh(geometry, meshMaterial);
scene = new THREE.Scene();
scene.add(mesh);
renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
window.addEventListener('resize', onWindowResize, false);
}
function onWindowResize(event) {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
}
function animate() {
requestAnimationFrame(animate);
render();
}
function render() {
var delta = clock.getDelta();
meshMaterial.uniforms.time.value += delta*0.1;
renderer.render(scene, camera);
}