mail4 google-plus3 facebook3 twitter3 vimeo3 github menu list next prev

openFrameworksでGPUパーティクル

2015-09-08

GPUParticles
先日、イベントでVJをさせていただく機会があり、ここ半年ほどあまりoFを触っていなかったので、リハビリも兼ねて、ミキサーからエフェクト、リアルタイムに生成する映像素材まで、一通りoFで作ってみました。
その中で、GPUパーティクルを用いた素材を作ってみたので、ごくシンプルな作例を載せておこうと思います。

パーティクルの数はとりあえず100万です。
Macbook Pro Retina Mid2015の最上位機で、1080pで実行して50~70fps程度でした。

ソースはGithubにあげましたので、もし興味があれば覗いてみてください。
https://github.com/yasuhirohoshino/GPUParticles

GPUパーティクルシステムの利点の一つは、比較的複雑な挙動をするパーティクルでも大量に扱うことができることです。
今回、Curl Noiseを使ったパーティクル表現をしたいと考えていましたが、普通にCPUで演算しVboMeshの頂点を移動させていくという実装では、理想的な数のパーティクルを動かすことができませんでした。

要となる部分については、oFに付属するサンプルのgl/gpuParticleSystemExampleのpingPongBufferを参考にしています。
ただ、元々のサンプルが位置と速度を別々のシェーダーで演算しているのに対し、同じシェーダーで位置と速度を演算できるように、一部を変更して使っています。

このpingPongBuffer.srcをパーティクルのレンダリング時にVertex Shaderで読み込み、パーティクルの位置(=ofVboMeshの頂点座標)を更新します。

Curl Noiseについては以下の記事を参考にしています。
http://blog.livedoor.jp/akinow/archives/52378824.html
https://syphobia.wordpress.com/2011/04/12/curl-noise-for-particles/
またノイズ関数としてAshima ArtsさんのSimplex Noiseを拝借しました。

その他諸々、Andreas MullerさんのNoiseWorkshopのソースは大変参考になりました。
(GLSLのコードを別のGLSL内でインクルードできることを初めて知りました。)

色を変えたり、初期化の位置をいじったり、グローをかけてみたりして、以下のようなものができました。

Pocket

Category : openFrameworks

2 / 6