Skip to content

Interactive and dynamic painting simulation in WebGL

Notifications You must be signed in to change notification settings

piellardj/paint-webgl

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

37 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Introduction

Interactive and dynamic painting simulation in WebGL.

Live version here.

This is a WebGL port of the visualization part of my OpenGL project flow-gpu.

Donate

Description

The painting is actually the superposition of several layers. Each layer is made of a set of particles, a flow map, and a background image.

Background

The background image is fixed and has 2 purposes:

  • to give a color to particles;
  • to generate the particles' initial position: the alpha channel of the background image serves as a density map that is used to randomly generate the positions

Flow map

The flowmap is a 2D vector field. It can be altered with the mouse, and has 2 purposes:

  • make the particles move;
  • give them an orientation

Particles

The particles are "paint strokes" and are drawn as oriented, colored rectangles. A particle has:

  • a fixed initial position;
  • a position, that changes following the underlying flow map;
  • a solid color that is sampled from the background at the particles' initial position;
  • a lifetime, after which the particle is returned to its initial position

A particles' state is stored in data textures, each pixel corresponding to a particle. The states are stored in 4 RGBA textures:

  • initial position texture: RG=x, BA=y. Each position component is stored as a 16bits integer.
  • position texture: RG=x, BA=y
  • birthdate texture: RG=t. Used to know when a particle has reached its lifetime and needs to be returned to its starting point.
  • "looks" texture: RGB=color, A=orientation

The WebGL extension ANGLE_instance_arrays is used to draw the particles. The position, birthdate and looks textures are updated in 3 separate passes, since by default WebGL doesn't support multiple render targets (MRT). There is an extension that allows MRT (WEBGL_draw_buffers), however this extension isn't widely supported yet (especially in mobile devices) so I chose not to use it.