Výkonné částicové systémy a WebGL

Částicové systémy

Výkon a WebGL

Ondřej Žára, @0ndras


Toto je zvukový test.

Částicový systém

Částicový systém

Implementace částicového systému

...máme necelých 20 30 minut, žaves

var dt = Date.now() - lastTime; particles.forEach(function(particle) { particle.velocity += dt * particle.acceleration; particle.position += dt * particle.velocity; draw(particle); // typicky kolečko či čtvereček });

Výkon částicového systému

Závodník #1: Canvas, 2d context

Závodník #1: Canvas, 2d context

CPU zatíženo simulací a pravděpodobně i vykreslováním

Závodník #2: Canvas, WebGL context

Závodník #2: Canvas, WebGL context

CPU zatíženo simulací a přenášením dat do GPU

Závodník #3: ???

Koncepty WebGL

  1. Nahrát do GPU vertex+fragment shadery
  2. Nahrát do GPU data
  3. Projít data, pomocí vertex shaderu je převést na výstupní souřadnice
  4. Provést rasterizaci dat mezi souřadnicemi a pomocí fragment shaderu je obarvit
  5. GOTO 2, GOTO 3 ?

Které operace jsou rychlé a které pomalé?

Koncepty WebGL

  1. Nahrát do GPU vertex+fragment shadery
  2. Nahrát do GPU data
  3. Projít data, pomocí vertex shaderu je převést na výstupní souřadnice
  4. Provést rasterizaci dat mezi souřadnicemi a pomocí fragment shaderu je obarvit
  5. GOTO 2, GOTO 3 ?

Myšlenka: je nutné provádět simulaci v JavaScriptu?

Závodník #3: Simulace ve vertex shaderu

Závodník #3: Simulace ve vertex shaderu

CPU po zásluze odpočívá

Co dovoluje shader

Co dovoluje shader

Bonus: JS knihovna

Bonus: JS knihovna

Particle System.js

Ukázka pasy.js

var scene = new pasy.Scene(); var ps = scene.particleSet() .count(100000) .pointSize(1, 3) .color([.4, .2, .1]) .attribute("position", 3, function(gl, count) { return pasy.randomSet(count, vec3, 0.05); }) .vertex("vec3 position = a_position;"); scene.add(ps);

Další ukázky pasy.js

Prostor pro otázky