HTML preprocessors can make writing HTML more powerful or convenient. For instance, Markdown is designed to be easier to write and read for text documents and you could write a loop in Pug.
In CodePen, whatever you write in the HTML editor is what goes within the <body>
tags in a basic HTML5 template. So you don't have access to higher-up elements like the <html>
tag. If you want to add classes there that can affect the whole document, this is the place to do it.
In CodePen, whatever you write in the HTML editor is what goes within the <body>
tags in a basic HTML5 template. If you need things in the <head>
of the document, put that code here.
The resource you are linking to is using the 'http' protocol, which may not work when the browser is using https.
CSS preprocessors help make authoring CSS easier. All of them offer things like variables and mixins to provide convenient abstractions.
It's a common practice to apply CSS to a page that styles elements such that they are consistent across all browsers. We offer two of the most popular choices: normalize.css and a reset. Or, choose Neither and nothing will be applied.
To get the best cross-browser support, it is a common practice to apply vendor prefixes to CSS properties and values that require them to work. For instance -webkit-
or -moz-
.
We offer two popular choices: Autoprefixer (which processes your CSS server-side) and -prefix-free (which applies prefixes via a script, client-side).
Any URLs added here will be added as <link>
s in order, and before the CSS in the editor. You can use the CSS from another Pen by using its URL and the proper URL extension.
You can apply CSS to your Pen from any stylesheet on the web. Just put a URL to it here and we'll apply it, in the order you have them, before the CSS in the Pen itself.
You can also link to another Pen here (use the .css
URL Extension) and we'll pull the CSS from that Pen and include it. If it's using a matching preprocessor, use the appropriate URL Extension and we'll combine the code before preprocessing, so you can use the linked Pen as a true dependency.
JavaScript preprocessors can help make authoring JavaScript easier and more convenient.
Babel includes JSX processing.
Any URL's added here will be added as <script>
s in order, and run before the JavaScript in the editor. You can use the URL of any other Pen and it will include the JavaScript from that Pen.
You can apply a script from anywhere on the web to your Pen. Just put a URL to it here and we'll add it, in the order you have them, before the JavaScript in the Pen itself.
If the script you link to has the file extension of a preprocessor, we'll attempt to process it before applying.
You can also link to another Pen here, and we'll pull the JavaScript from that Pen and include it. If it's using a matching preprocessor, we'll combine the code before preprocessing, so you can use the linked Pen as a true dependency.
Search for and use JavaScript packages from npm here. By selecting a package, an import
statement will be added to the top of the JavaScript editor for this package.
Using packages here is powered by esm.sh, which makes packages from npm not only available on a CDN, but prepares them for native JavaScript ESM usage.
All packages are different, so refer to their docs for how they work.
If you're using React / ReactDOM, make sure to turn on Babel for the JSX processing.
If active, Pens will autosave every 30 seconds after being saved once.
If enabled, the preview panel updates automatically as you code. If disabled, use the "Run" button to update.
If enabled, your code will be formatted when you actively save your Pen. Note: your code becomes un-folded during formatting.
Visit your global Editor Settings.
<!-- Physics shaders -->
<script id="physics-vert" type="x-vertex-shader">
attribute vec2 aVertexPosition;
void main() {
gl_Position = vec4( aVertexPosition, 1, 1 );
}
</script>
<script id="physics-frag" type="x-fragment-shader">
precision mediump float;
const vec3 TARGET = vec3( 0, 0, 0.01 );
uniform sampler2D uParticleData;
uniform vec2 uViewport;
// Retrieves the texel at a given offset from the current pixel
vec4 texelAtOffet( vec2 offset ) {
return texture2D( uParticleData, ( gl_FragCoord.xy + offset ) / uViewport );
}
void main() {
// Determine which data slot we're at (position or velocity)
int slot = int( mod( gl_FragCoord.x, 2.0 ) );
if ( slot == 0 ) { // position
// Retrieve data at current and adjacent slots
vec4 dataA = texelAtOffet( vec2( 0, 0 ) );
vec4 dataB = texelAtOffet( vec2( 1, 0 ) );
// Extract position and velocity data
vec3 pos = dataA.xyz;
vec3 vel = dataB.xyz;
float phase = dataA.w;
if ( phase > 0.0 ) {
// Integrate velocity
pos += vel * 0.005;
// Kill the particle if it's near the target
if ( length( TARGET - pos ) < 0.035 ) phase = 0.0;
else phase += 0.1;
} else {
pos = vec3(-1);
}
// Write out the new position data
gl_FragColor = vec4( pos, phase );
} else if ( slot == 1 ) { // velocity
// Retrieve data at current and previous slots
vec4 dataA = texelAtOffet( vec2( -1, 0 ) );
vec4 dataB = texelAtOffet( vec2( 0, 0 ) );
// Extract position and velocity data
vec3 pos = dataA.xyz;
vec3 vel = dataB.xyz;
float phase = dataA.w;
if ( phase > 0.0 ) {
// Compute a normalised vector pointing towards target
vec3 delta = normalize( TARGET - pos );
// Add a force along the delta vector
vel += delta * 0.05;
// Add a drag force
vel *= 0.991;
} else {
vel = vec3(0);
}
// Write out the velocity data
gl_FragColor = vec4( vel, 1.0 );
}
}
</script>
<!-- Render shaders -->
<script id="render-vert" type="x-vertex-shader">
attribute vec2 aParticleUV;
uniform sampler2D uParticleData;
void main() {
vec4 particle = texture2D( uParticleData, aParticleUV );
float perspective = 1.0 + particle.z * 5.5;
float phase = cos( particle.w ) * max( 0.5, tan( particle.z * 8.05 ) );
gl_Position = vec4( particle.xyz, perspective );
gl_PointSize = min( 64.0, ( 1.0 / perspective ) * ( 0.5 + phase ) );
}
</script>
<script id="render-frag" type="x-fragment-shader">
uniform sampler2D uParticleTexture;
void main() {
gl_FragColor = texture2D( uParticleTexture, gl_PointCoord );
}
</script>
<!-- Debug shaders -->
<script id="debug-vert" type="x-vertex-shader">
attribute vec2 aVertexPosition;
varying vec2 vTexCoord;
void main() {
// Map from xy (-1 -> 1) to uv (0 -> 1)
vTexCoord = ( aVertexPosition + 1.0 ) / 2.0;
gl_Position = vec4( aVertexPosition, 1, 1 );
}
</script>
<script id="debug-frag" type="x-fragment-shader">
precision mediump float;
uniform sampler2D uParticleData;
varying vec2 vTexCoord;
void main() {
gl_FragColor = vec4( texture2D( uParticleData, vTexCoord ).xyz, 0.8 );
}
</script>
<div class='info'>
<hgroup class='about'>
<h1>1,048,576 Particles</h1>
<h2>GPU Physics with WebGL</h2>
</hgroup>
<nav class='more'>
<a target="_blank" href='https://soulwire.co.uk/'>soulwire</a>
<a target="_blank" href='https://github.com/soulwire/WebGL-GPU-Particles'>View on GitHub</a>
</nav>
</div>
<div class="cb toggle-fbo">
<input class="toggle" type="checkbox"/>
<span class="button">Show FBO</span>
</div>
<div id="nogl">
<h1>Aww, No WebGL :(</h1>
<p>This experiment requires WebGL to run. Please enable it, or come back and visit with a <a href="http://caniuse.com/webgl" target="_blank">compatible browser</a>.</p>
</div>
<img id="particle-texture" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo3M0FFRTA3OUQ1NDAxMUUyQUY5MURFMTJFRkNGRDhFOSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo3M0FFRTA3QUQ1NDAxMUUyQUY5MURFMTJFRkNGRDhFOSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjczQUVFMDc3RDU0MDExRTJBRjkxREUxMkVGQ0ZEOEU5IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjczQUVFMDc4RDU0MDExRTJBRjkxREUxMkVGQ0ZEOEU5Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+jzi7rgAAw+RJREFUeNrsvWmP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">
@import url( https://fonts.googleapis.com/css?family=Quantico );
html, body {
font-family: 'Quantico', sans-serif;
background: #1c3149;
background: -moz-radial-gradient(center, ellipse cover, #1c3149 0%, #0d121c 80%);
background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%,#1c3149), color-stop(80%,#0d121c));
background: -webkit-radial-gradient(center, ellipse cover, #1c3149 0%,#0d121c 80%);
background: -o-radial-gradient(center, ellipse cover, #1c3149 0%,#0d121c 80%);background: -ms-radial-gradient(center, ellipse cover, #1c3149 0%,#0d121c 80%);
background: radial-gradient(ellipse at center, #1c3149 0%,#0d121c 80%);
overflow: hidden;
margin:0;
}
#particle-texture {
display: none;
}
/* GUI */
.cb {
position: absolute;
cursor: pointer;
right: 20px;
top: 20px;
}
.cb .button {
-webkit-transition: all 200ms ease-out;
-moz-transition: all 200ms ease-out;
-o-transition: all 200ms ease-out;
transition: all 200ms ease-out;
text-transform: uppercase;
font-family: Arial, "Helvetica Neue", Helvetica, sans-serif;
border-radius: 2px;
text-align: center;
line-height: 25px;
font-size: 11px;
display: block;
opacity: 0.8;
height: 25px;
width: 80px;
color: #fff;
}
.cb .button:hover {
opacity: 1.0;
}
.cb .toggle {
position: absolute;
opacity: 0.0;
z-index: 1;
display: block;
cursor: pointer;
height: 100%;
width: 100%;
}
.cb .toggle ~ .button {
background: #000;
}
.cb .toggle:checked ~ .button {
background: #2ecc71;
}
/* No GL */
#nogl {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
-ms-box-sizing: border-box;
-o-box-sizing: border-box;
box-sizing: border-box;
border-radius: 3px;
line-height: 1.45;
text-align: justify;
box-shadow: 0px 0px 0px 4px rgba(255,0,41,0.2);
background: #FF0029;
font-size: 13px;
position: absolute;
padding: 10px 20px;
display: none;
margin: -70px 0 0 -130px;
height: 140px;
width: 260px;
color: #fff;
left: 50%;
top: 50%;
}
#nogl h1 {
font-weight: 300;
font-size: 18px;
margin: 12px 0;
}
#nogl p {
color: rgba(255,255,255,0.7);
}
#nogl a {
color: #fff;
}
/* Info */
@-webkit-keyframes show-info {
0% { -webkit-transform: rotateY(120deg); }
100% { -webkit-transform: rotateY(0deg); }
}
@-moz-keyframes show-info {
0% { -moz-transform: rotateY(120deg); }
100% { -moz-transform: rotateY(0deg); }
}
@-ms-keyframes show-info {
0% { -ms-transform: rotateY(120deg); }
100% { -ms-transform: rotateY(0deg); }
}
@-o-keyframes show-info {
0% { -o-transform: rotateY(120deg); }
100% { -o-transform: rotateY(0deg); }
}
@keyframes show-info {
0% { transform: rotateY(120deg); }
100% { transform: rotateY(0deg); }
}
.info {
-webkit-transition: all 180ms ease-out;
-moz-transition: all 180ms ease-out;
-ms-transition: all 180ms ease-out;
-o-transition: all 180ms ease-out;
transition: all 180ms ease-out;
-webkit-transform-style: preserve-3d;
-moz-transform-style: preserve-3d;
-ms-transform-style: preserve-3d;
-o-transform-style: preserve-3d;
transform-style: preserve-3d;
-webkit-transform: perspective(800);
-moz-transform: perspective(800);
-ms-transform: perspective(800);
-o-transform: perspective(800);
transform: perspective(800);
position: absolute;
font-size: 12px;
opacity: 0.8;
color: #fff;
width: 240px;
left: 0px;
top: 20px;
}
.info:hover {
box-shadow: 0 0 0 4px rgba(255,255,255,0.05);
opacity: 1.0;
}
.info h1,
.info h2,
.info h3 {
line-height: 1;
margin: 5px 0;
}
.info a {
-webkit-transition: all 200ms ease-out;
-moz-transition: all 200ms ease-out;
-ms-transition: all 200ms ease-out;
-o-transition: all 200ms ease-out;
transition: all 200ms ease-out;
border-bottom: 1px dotted rgba(255,255,255,0.4);
text-decoration: none;
opacity: 0.6;
color: #fff;
}
.info a:hover {
opacity: 0.99;
}
.info .about, .info .more {
-webkit-transform-origin: 0% 50%;
-moz-transform-origin: 0% 50%;
-ms-transform-origin: 0% 50%;
-o-transform-origin: 0% 50%;
transform-origin: 0% 50%;
-webkit-transform: rotateY(120deg);
-moz-transform: rotateY(120deg);
-ms-transform: rotateY(120deg);
-o-transform: rotateY(120deg);
transform: rotateY(120deg);
margin-bottom: 1px;
background: rgba(0,0,0,0.8);
padding: 12px 15px 12px 20px;
}
.info .about {
-webkit-animation: show-info 500ms cubic-bezier(0.230, 1.000, 0.320, 1.000) 600ms 1 normal forwards;
-moz-animation: show-info 500ms cubic-bezier(0.230, 1.000, 0.320, 1.000) 600ms 1 normal forwards;
-ms-animation: show-info 500ms cubic-bezier(0.230, 1.000, 0.320, 1.000) 600ms 1 normal forwards;
-o-animation: show-info 500ms cubic-bezier(0.230, 1.000, 0.320, 1.000) 600ms 1 normal forwards;
animation: show-info 500ms cubic-bezier(0.230, 1.000, 0.320, 1.000) 600ms 1 normal forwards;
padding-bottom: 15px;
}
.info .about a {
opacity: 0.9;
}
.info .about h1 {
letter-spacing: -1px;
font-weight: 300;
font-size: 19px;
opacity: 0.95;
}
.info .about h2 {
font-weight: 300;
font-size: 13px;
opacity: 0.8;
}
.info .about h3 {
text-transform: uppercase;
margin-top: 10px;
font-size: 11px;
}
.info .about h3:before {
margin-right: 2px;
font-size: 14px;
content: '\203A';
}
.info .more {
-webkit-animation: show-info 500ms cubic-bezier(0.230, 1.000, 0.320, 1.000) 500ms 1 normal forwards;
-moz-animation: show-info 500ms cubic-bezier(0.230, 1.000, 0.320, 1.000) 500ms 1 normal forwards;
-ms-animation: show-info 500ms cubic-bezier(0.230, 1.000, 0.320, 1.000) 500ms 1 normal forwards;
-o-animation: show-info 500ms cubic-bezier(0.230, 1.000, 0.320, 1.000) 500ms 1 normal forwards;
animation: show-info 500ms cubic-bezier(0.230, 1.000, 0.320, 1.000) 500ms 1 normal forwards;
padding: 5px 15px 10px 20px;
}
.info .more a {
text-transform: uppercase;
margin-right: 10px;
font-size: 10px;
}
// MIT License
// @see https://github.com/soulwire/WebGL-GPU-Particles
/*
------------------------------------------------------------
Config
------------------------------------------------------------
*/
// Number of particles
var PARTICLE_COUNT = Math.pow( 1024, 2 );
// Particle count must be power of 2
var PARTICLE_COUNT_SQRT = Math.sqrt( PARTICLE_COUNT );
// How many texture slots each particle needs for it's data
var PARTICLE_DATA_SLOTS = 2;
// The required size of the FBO containing the particle data
var PARTICLE_TEXTURE_WIDTH = PARTICLE_COUNT_SQRT * PARTICLE_DATA_SLOTS;
var PARTICLE_TEXTURE_HEIGHT = PARTICLE_COUNT_SQRT;
// How many particles can be emitted at a given time
var PARTICLE_EMIT_RATE = 1000;
/*
------------------------------------------------------------
Variables
------------------------------------------------------------
*/
// Stats instance
var stats;
// Programs
var physicsProgram;
var renderProgram;
var debugProgram;
// Buffers and textures
var particleUVDataBuffer;
var particleDataTexture;
var particleFramebuffer;
var viewportQuadBuffer;
var particleData;
// Shaders
var shaders = {
physics_vert: getShader( 'physics-vert' ),
physics_frag: getShader( 'physics-frag' ),
render_vert: getShader( 'render-vert' ),
render_frag: getShader( 'render-frag' ),
debug_vert: getShader( 'debug-vert' ),
debug_frag: getShader( 'debug-frag' )
};
var debugToggle = document.querySelector( '.toggle-fbo .toggle' );
// Sketch instance (augmented WebGL context)
var gl = Sketch.create({
type: Sketch.WEBGL,
autostart: false
});
if ( !gl ) {
nogl = document.getElementById( 'nogl' );
nogl.style.display = 'block';
}
/*
------------------------------------------------------------
Helper methods
------------------------------------------------------------
*/
// Retrieves shader source from a script element in the DOM
function getShader( id ) {
return document.getElementById( id ).textContent;
}
// Creates and compiles a shader from source
function createShader( source, type ) {
var shader = gl.createShader( type );
gl.shaderSource( shader, source );
gl.compileShader( shader );
if ( !gl.getShaderParameter( shader, gl.COMPILE_STATUS ) )
throw gl.getShaderInfoLog( shader );
return shader;
}
// Creates a shader program and creates / links shaders
function createProgram( vertexSource, fragmentSource ) {
var vs = createShader( vertexSource, gl.VERTEX_SHADER );
var fs = createShader( fragmentSource, gl.FRAGMENT_SHADER );
var program = gl.createProgram();
gl.attachShader( program, vs );
gl.attachShader( program, fs );
gl.linkProgram( program );
if ( !gl.getProgramParameter( program, gl.LINK_STATUS ) )
throw gl.getProgramInfoLog( program );
return program;
}
// Sets `count` particles to be alive, positions them at the emission `origin` and gives them
// an initial random velocity
function emitParticles( count, origin, velocities ) {
velocities = velocities || { x:0.0, y:0.0, z:0.0 };
// Bind the particle data texture since we'll be updating it
gl.activeTexture( gl.TEXTURE0 + particleDataTexture.unit );
gl.bindTexture( gl.TEXTURE_2D, particleDataTexture );
// Determine the x and y coordinates in the particle data texture to start writing to
var x = ~~( ( gl.particleIndex * PARTICLE_DATA_SLOTS ) % PARTICLE_TEXTURE_WIDTH );
var y = ~~( gl.particleIndex / PARTICLE_TEXTURE_HEIGHT );
// An array defining the chunks of texture to be updated
var chunks = [{
x: x,
y: y,
size: count * PARTICLE_DATA_SLOTS
}];
// Recursively splits chunks until they will all fit into the particle data texture
function split( chunk ) {
var boundary = chunk.x + chunk.size;
// If the chunk will exceed the texture size, it must be split
if ( boundary > PARTICLE_TEXTURE_WIDTH ) {
// How many slots fall outside the texture dimensions
var delta = boundary - PARTICLE_TEXTURE_WIDTH;
// Reduce the current chunk size to fit
chunk.size -= delta;
// Create a new chunk from the orphaned data
chunk = {
x: 0,
y: ( chunk.y + 1 ) % PARTICLE_TEXTURE_HEIGHT,
size: delta
};
// Store the new chunk
chunks.push( chunk );
// Continue splitting chunks
split( chunk );
}
}
// Start splitting chunks until we can fit them all into the texture
split( chunks[0] );
// Now that we have a set of chunks that fit, start updating the texture data
var i, j, n, m, chunk, data, force = 1.0;
for ( i = 0, n = chunks.length; i < n; i++ ) {
chunk = chunks[i];
data = [];
for ( j = 0, m = chunk.size; j < m; j++ ) {
data.push(
// Move the particle to the emission origin
origin.x,
origin.y,
origin.z,
// Set the phase above 0, switching it on for use
random( 10 ),
// Populate the velocity slot with an initial random force
velocities.x + force * random( -1.0, 1.0 ),
velocities.y + force * random( -1.0, 1.0 ),
velocities.z + force * random( -1.0, 1.0 ),
// Empty data slot
0
);
}
// Now we modify the pixels of the particle data texture inside the chunk boundaries
gl.texSubImage2D(
// target, detail level, x, y, width, height
gl.TEXTURE_2D, 0, chunk.x, chunk.y, chunk.size, 1,
// data format, data type, pixels
gl.RGBA, gl.FLOAT, new Float32Array( data )
);
}
// Update the particle index
gl.particleIndex += count;
gl.particleIndex %= PARTICLE_COUNT;
}
/*
------------------------------------------------------------
Demo
------------------------------------------------------------
*/
gl.setup = function() {
// Add Stats.js so we can monitor the FPS
stats = new Stats();
stats.domElement.style.position = 'absolute';
stats.domElement.style.right = '20px';
stats.domElement.style.top = '50px';
document.body.appendChild( stats.domElement );
// Set persistant states
gl.clearColor( 0.0, 0.0, 0.0, 0.0 );
// Store some extra data we'll need
gl.particleIndex = 0;
// Enable extensions - this won't work without floating point textures!
if ( !gl.getExtension( 'OES_texture_float' ) ) alert( 'Float textures not supported' );
// Create shader programs
physicsProgram = createProgram( shaders.physics_vert, shaders.physics_frag );
renderProgram = createProgram( shaders.render_vert, shaders.render_frag );
debugProgram = createProgram( shaders.debug_vert, shaders.debug_frag );
// Store physics program attribute and uniform locations
physicsProgram.aVertexPositionLoc = gl.getAttribLocation( physicsProgram, 'aVertexPosition' );
physicsProgram.uParticleDataLoc = gl.getUniformLocation( physicsProgram, 'uParticleData' );
physicsProgram.uViewportLoc = gl.getUniformLocation( physicsProgram, 'uViewport' );
// Store render program attribute and uniform locations
renderProgram.uParticleTextureLoc = gl.getUniformLocation( renderProgram, 'uParticleTexture' );
renderProgram.uParticleDataLoc = gl.getUniformLocation( renderProgram, 'uParticleData' );
renderProgram.aParticleUVLoc = gl.getAttribLocation( renderProgram, 'aParticleUV' );
// Store debug program attribute and uniform locations
debugProgram.aVertexPositionLoc = gl.getAttribLocation( debugProgram, 'aVertexPosition' );
debugProgram.uParticleDataLoc = gl.getUniformLocation( debugProgram, 'uParticleData' );
// Enable array attribute slots in programs
gl.enableVertexAttribArray( physicsProgram.aVertexPositionLoc );
gl.enableVertexAttribArray( renderProgram.aParticleUVLoc );
gl.enableVertexAttribArray( debugProgram.aVertexPositionLoc );
// Setup the initial particle data (4 components per particle slot, all zeros)
particleData = new Float32Array( 4 * PARTICLE_COUNT * PARTICLE_DATA_SLOTS );
// Create a texture to hold the particle data
particleDataTexture = gl.createTexture();
particleDataTexture.unit = 0;
// Activate the correct texture unit and bind the texture to it
gl.activeTexture( gl.TEXTURE0 + particleDataTexture.unit );
gl.bindTexture( gl.TEXTURE_2D, particleDataTexture );
// Fill the texture with the initial particle data
gl.texImage2D(
// target, level, internal format, width, height
gl.TEXTURE_2D, 0, gl.RGBA, PARTICLE_TEXTURE_WIDTH, PARTICLE_TEXTURE_HEIGHT,
// border, data format, data type, pixels
0, gl.RGBA, gl.FLOAT, particleData
);
// Disable bilinear filtering when minifying / magnifying texture
gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );
gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );
// Clamp the texture to the edge (don't repeat)
gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );
gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );
// Create a framebuffer for the physics simulations to render updated particle data to and
// populate it with the initial particle data stored inside `particleDataTexture`
particleFramebuffer = gl.createFramebuffer();
gl.bindFramebuffer( gl.FRAMEBUFFER, particleFramebuffer );
gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, particleDataTexture, 0 );
// Create UV coordinates for each particle (0 -> 1). This will tell the physics shader where
// to find each particle's data inside the particle texture
var particleUVData = new Float32Array( PARTICLE_COUNT * 2 );
var interval = 1.0 / PARTICLE_COUNT_SQRT;
for ( var i = 0, u = 0, v = 1; i < PARTICLE_COUNT; i++, u = i * 2, v = u + 1 ) {
particleUVData[ u ] = interval * ~~( i % PARTICLE_COUNT_SQRT ); // u
particleUVData[ v ] = interval * ~~( i / PARTICLE_COUNT_SQRT ); // v
}
// Buffer in the particle UV data for the render program
particleUVDataBuffer = gl.createBuffer();
gl.bindBuffer( gl.ARRAY_BUFFER, particleUVDataBuffer );
gl.bufferData( gl.ARRAY_BUFFER, particleUVData, gl.STATIC_DRAW );
gl.enableVertexAttribArray( renderProgram.aParticleUVLoc );
// Create geometry for a fullscreen clipspace quad
var viewportQuadVertices = new Float32Array([
-1.0, -1.0, // 2----3
1.0, -1.0, // | \ |
-1.0, 1.0, // | \ |
1.0, 1.0 // 0----1
]);
// Buffer in the geometry, used to fill FBOs at the full size of the viewport
viewportQuadBuffer = gl.createBuffer();
gl.bindBuffer( gl.ARRAY_BUFFER, viewportQuadBuffer );
gl.bufferData( gl.ARRAY_BUFFER, viewportQuadVertices, gl.STATIC_DRAW );
// Create a texture for the particle image asset
var particleTexture = gl.createTexture();
particleTexture.unit = 1;
// Load the particle asset into the texture
var particleTextureImage = document.getElementById( 'particle-texture' );
// Activate the correct texture unit and bind the texture to it
gl.activeTexture( gl.TEXTURE0 + particleTexture.unit );
gl.bindTexture( gl.TEXTURE_2D, particleTexture );
gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST );
gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR );
gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );
gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );
gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, particleTextureImage );
gl.generateMipmap( gl.TEXTURE_2D );
// Set physics program uniform values
gl.useProgram( physicsProgram );
gl.uniform1i( physicsProgram.uParticleDataLoc, 0 );
gl.uniform2f( physicsProgram.uViewportLoc, PARTICLE_TEXTURE_WIDTH, PARTICLE_TEXTURE_HEIGHT );
// Set render program uniform values
gl.useProgram( renderProgram );
gl.uniform1i( renderProgram.uParticleDataLoc, particleDataTexture.unit );
gl.uniform1i( renderProgram.uParticleTextureLoc, particleTexture.unit );
// Set debug program uniform values
gl.useProgram( debugProgram );
gl.uniform1i( debugProgram.uParticleDataLoc, 0 );
// Kick it off!
gl.start();
};
gl.draw = function() {
// Spit out some initial particles
if ( gl.millis < 3000 ) {
emitParticles( 800, {
x: -1.0 + sin( gl.millis * 0.001 ) * 2.0,
y: -0.2 + cos( gl.millis * 0.004 ) * 0.5,
z: sin( gl.millis * 0.015 ) * -0.05
});
}
stats.begin();
// 1. Physics step
// Set the viewport to the size of the particle data texture since we're rendering to that
gl.viewport( 0, 0, PARTICLE_TEXTURE_WIDTH, PARTICLE_TEXTURE_HEIGHT );
// Prepare the physics program to execute per fragment of the particle data texture
gl.useProgram( physicsProgram );
gl.bindBuffer( gl.ARRAY_BUFFER, viewportQuadBuffer );
gl.vertexAttribPointer( physicsProgram.aVertexPositionLoc, 2, gl.FLOAT, gl.FALSE, 0, 0 );
// Tell WebGL to use the particle FBO, not the front buffer for (offscreen) rendering
gl.bindFramebuffer( gl.FRAMEBUFFER, particleFramebuffer );
gl.drawArrays( gl.TRIANGLE_STRIP, 0, 4 );
// Unbind the FBO, WebGL will now use the default buffer for rendering
gl.bindFramebuffer( gl.FRAMEBUFFER, null );
// 2. Render step
// Clear the front buffer (if we had called clear when the particle FBO was bound, it
// would have nixed the particle position and velocity data)
gl.clear( gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT );
// Set the viewport size to the full canvas
gl.viewport( 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight );
// For each particle, pull out the position and render it as a point to the screen
gl.useProgram( renderProgram );
gl.bindBuffer( gl.ARRAY_BUFFER, particleUVDataBuffer );
gl.vertexAttribPointer( renderProgram.aParticleUVLoc, 2, gl.FLOAT, gl.FALSE, 0, 0 );
// Draw with additive blending
gl.enable( gl.BLEND );
gl.blendFunc( gl.SRC_ALPHA, gl.ONE );
gl.drawArrays( gl.POINTS, 0, PARTICLE_COUNT );
// 3. Debug step
if ( debugToggle.checked ) {
gl.viewport( 20, 20, 600, 300 );
gl.useProgram( debugProgram );
gl.bindBuffer( gl.ARRAY_BUFFER, viewportQuadBuffer );
gl.vertexAttribPointer( debugProgram.aVertexPositionLoc, 2, gl.FLOAT, gl.FALSE, 0, 0 );
// Draw with interpolative blending
gl.blendFunc( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA );
gl.drawArrays( gl.TRIANGLE_STRIP, 0, 4 );
}
gl.disable( gl.BLEND );
stats.end();
};
gl.mousemove = function() {
if ( gl.running && !gl.lastEmit || gl.millis - gl.lastEmit > 16 ) {
gl.lastEmit = gl.millis;
var i, n, x, y, touch, limit = PARTICLE_EMIT_RATE / gl.touches.length;
for ( i = 0, n = gl.touches.length; i < n; i++ ) {
touch = gl.touches[i];
// Convert mouse screen coordinates into clipspace coordinates
x = map( touch.x, 0, gl.width, -1, 1 );
y = map( touch.y, 0, gl.height, 1, -1 );
// Emit some particles!
emitParticles( limit, {
x: x,
y: y,
z: 0.0
});}
}
};
Also see: Tab Triggers