SVGの背景を透過するサンプル jit.mgraphics × jit.gl.pix #maxmsp #jitter #gen

スクリーンショット 2014-10-17 11.57.59jit.mgraphicsで描画したSVGに透過色を持たせたい場合には、jit.gl.pixで特定の色を透過させる処理を書くと良さそうです。上の画像は、カメラのキャプチャにSVGの描画を載せたサンプル。棚がとっ散らかってますが、お気にせず・・・

jit.mgraphicsで背景黒にして描画

スクリーンショット 2014-10-17 11.56.39svgでピンクの丸を描画してます。ちなみにillustratorでSVGをつくりました。(左側に、ちょっと、余分なコードも入ってますがお気にせず。)

jit.gl.pix 黒を透過

スクリーンショット 2014-10-17 12.06.54厳密に言うと、黒に近いほど透過されるコードに成ってますが、とりあえず目的に適うのでオッケーです。

Code(シェーダ部分)


----------begin_max5_patcher----------
757.3oc0WssahCCD84juBK+LKxNAnj8s86.UgLItgoqwNxwbYaU+2WamKjvF
pnkVDqPJANy3wGe73gwuFFfWoNvKwnehVfBBdMLHvC4.Bp+c.dC6PpfU5cCK
46UqdFOpxjgev3geFLiyEiKfCn8fLSsuwimTRSI7B24EMZLoFVs0H3FyeJ3U
StK.KyEKcAbqliGgvXzi0NK2tAjV28LfdDrJHdznZzBlIcMHyWp4olpPGSlZ
mVTzL+qjI9ePFSZCuihR1FOSv+RCLQC4gLOlcA+C5Lb2ofqq0nZQxFEPv2w0
kfR1glAXVQQG3fNCworOq7AZ1nVHPVAQagz7cPy3SZQYZ6B0XWkN4xwxCymg
qL9VXyjeTEhnIN0GQmG6E.5CtWwSiNJD1s97TknZ5WfHiSF04AsuiBU5u4d4
gz.pJ3RPVn4kbogYpYbq4L9SrsByxgyH5a+IVJ+rCdv8p.btFxTRGI5MRGby
zs.Q8IAtmGWLdOjrhAFboccrsbES61AVI3cR0rI+Jknuo1Mc6YHlD1vLbCTQ
1HRaPgMEZPZ5MQbIyFi0koZkPzKTUV1MfkLadQJeOjYV6iUWoz5NTzrEfa0n
LHmWZ5iYX4k8Q5UTnaBa2hC8veuhD8KTTtGdAoyW003YxHFrNQaUgyVYXfpC
csLPEBJweXHwexX5zSKP79EINsPQTDtA+svvluL5qWI2.G9FDw3OqHNm30sI
d4axrqTDo2HQTvk41iO2eIizod8bR7UJjjajPtimhHUe9FTyIeV0Lt5zL0Kl
O7v0IlzjajXBRD8aPEIeVUzVYbpsYApukAxUJh2HMzt5tXQ7BO4RtjJfwj49
WWYt1jgjoi8rH.449KZOyb1GV+JUa0oMIK0+gksEudrz1+fAjssvsnsVxoNt
Fxx52xTUWFktdVp5N7h1s+nbldoTN5+OJ6bjdWP4nKkySteT4jOhLeev4ANW
8NbN5KfynGCOh3eVWa4zaq5n8I2R8jan9u2N8b2L0NOuE9W.Vv2VrA
-----------end_max5_patcher-----------

こういう微妙なコードをBlogに書いとくと、後で再利用しやすいのが良いですね。Max7だと、コードスニペット機能が充実するそうなので、楽しみですな〜。


jit.gl.pix @gen によるシェーダ切り替えで画面が一瞬止まる問題について #jitter #maxmsp

スクリーンショット 2014-08-07 02.45.33

シェーダ切り替え

jit.gl.pixにて@genによるシェーダの切り替えを行うと一瞬画面が止まってしまう事案が発生いたしました。この原因は2つ考えられるかなと思いまして

  1. jit.gl.pixが内部的に.jitgen → .jxs / GLSLに変換してシェーダを使うため、SSDやHDDとファイルのRead/Write処理が同期的に行われて止まる
  2. GPU上へシェーダを転送・コンパイルする時に止まる

検証はできてないですが、1の方が原因としては重たそう。というのも、jit.qt.movieでreadするとファイル読み込みで画面が止まってしまう現象と同じなためです。jit.qt.movieではasyncread使うことで再生中の動画を止めずに切り替える事が可能ですね。ただ、実はこれも問題があり、大量のjit.qt.movieに対してasyncreadを指示すると画面止まります。内部的にどうやってるかコード読んでみたい。(関係ないけど、Windows版のMaxの非同期読込もサポートしてほしいな・・・。)余談はさておき、jit.gl.pixには非同期読み込みをするメッセージを送れません!

対処方法

BiLmv_hCUAEVOcq.jpg-largeパッチをロードしたタイミングで使いたいシェーダの数だけjit.gl.pixをインスタンス化しておく。使おうと思った時にはメモリ上に載っているので画面が止まる事は無さそうです。スマートなやり方ではないですが、この方法しかないかな・・・?使いたいシェーダの数が増えるとメンテナンスが大変になりそうなので、jsオブジェクトなどを使ってメタプログラミングでオブジェクトの自動生成をすれば、メンテナンスも楽そうです。やりすぎるとGPUのメモリが足りなくなる事案も発生しそうですが。

ちなみに上記画像は遠藤一郎氏のライブペインティングでプログラムしたときに使ったパッチのキャプチャです。音声ファイルを400個近く読み込む必要があって、ライブ中にファイル読込で止まるのが嫌だったので、起動時に全部メモリ上にロードしておくプログラムをjavascriptで書きました。


jit.gl.pix における2次元平面のアンチエイリアス処理 #maxmsp #jitter

jit.gl.pixでトランジションエフェクト

あのタグの次期バージョンに入れるトランジションエフェクトを開発しています。例えば、中央から丸が出てきて画面全体に広がるようなエフェクトをつくろうとすると、丸を書いて2つのテクスチャを割当るだけで簡単そうです。しかし、単純につくるとエッジがギザギザしてしまいます。そこでjit.gl.pix(フラグメントシェーダ)におけるアンチエイリアスを実装してみます。

アンチエイリアス処理有り

スクリーンショット 2014-08-10 03.08.23

アンチエイリアス処理無し

スクリーンショット 2014-08-10 03.13.37中央の円のエッジがギザギザしており、VJなどで大画面に表示するともっと気になるかなと思います。

円トランジションjit.gl.pix

スクリーンショット 2014-08-10 03.25.40現在のピクセルの半径rと、トランジションする円の半径rとの距離をとって、その距離が短い場合に(0~0.005の距離)smoothstepで補間をしています。補完した値でmixする事でエッジをなだらかに繋ぐ事が可能です。ここを単純に書くと大なり小なりで比較して、0 or 1ピクセルの色を指定して、switchやif文でピクセル値を切り替えて出力したくなりますが、それではエッジがギザギザになってしまいます。


jit.gen vs jit.gl.pix Vetex Array 生成対決:#max6 #maxmsp #jitter #cycling74

スクリーンショット 2014-07-16 0.43.34

フォーラムに似たようなスレッドがありますがMaxにおけるGPUとCPUの対決です!球体のVertex Arrayをjit.gen / jit.gl.pix の両方で生成できるパッチをつくりました。それをjit.gl.meshへ入力し上記のような画像を生成します。

実装

スクリーンショット 2014-07-16 1.02.34
jit.gl.pixはGPU上の処理でVertexの配置を保持したテクスチャを生成しますが、そのままjit.gl.meshへの入力へは使えません。まずはjit.gl.pixの出力をjit.matrixに入力する事で、CPU側のメモリにGPU側のテクスチャを呼び戻します。jit.gl.pixはplane数が4に固定されています、ARGBですね。なので次にjit.genを使ってplane数を3に削減してjit.gl.meshに入力できるplane数に変更しています。ちなみにこのplane削減処理は、jit.unpackでも出来ますが、jit.genのswizを利用した方が多少早かったです。こうして、GPU計算したVertexをjit.gl.meshの描画に利用できます。

それではMaxにおけるCPU vs GPUの対決やいかに・・・!

結果

fps(@sync 0) : jit.gen 100fps / jit.gl.pix 70fps
CPU使用率 : jit.gen 140% / jit.gl.pix 60%
※アクティビティモニタで目測

jit.gl.pix(GPU)はfpsが伸びなかったです。代わりに、CPU使用率が下がっていますね。これはMSPと共存させるような方には良いかもしれません。ただ描画速度やパーティクル数を稼ぎたい場合は、jit.gen(CPU)を使う方が良いみたいです。というかjit.genは、シェーダーのように並列演算しやすい形で記述するので、裏でCPUの並列計算をするようになっているそうです。

TIPS

スクリーンショット 2014-07-16 0.45.17

  • jit.gl.pix dimの最大値 16384 か?それ以上の値になると表示がバグる
  • jit.gen / jit.gl.pix 内部で使えるプリミティブ(circle,sphere,torus等)楽しい

Sample Patch


----------begin_max5_patcher----------
2043.3oc6bssjahCD8Y6uBJp8wYmEIw08or09YLaJWXirsR3hWPdtjT40848
ab+RVcAvfMfkIXMdRlIULwR.p6S2p0oUqIec9LykYOiKLM9ciGLlM6qymMSz
DugYkeelYR3yqhCKD2l4prjDbJ07NYeT7yTQ6ehPueCN03wBCw+L99cjmM9q
zkuX7gDRddV9xrWpdpXRJdU19TwiBKajDIdQYK+zuhPU245rT55vUXdWnx1R
2mPRiwTg.AZbiEjuHtQn88VUMmuYIuIq5V1ERWskjtYQNdEUp4PeVuFPG9mH
fG+hK6AL93gALaOsZDsZLhogIhQz7OxIgwl7N91747OtSQ7jlsYSL1rCL.T0
nbrourCKEWSBG393PnQGJIJ.cuSkVBfA0W5QMO7pxYJIEmu.mFtLVHCViPQ6
yw4+9m+8O2FltAaT4B8aM7f5.Xf1lp5H.fWli.xCJvHaj.cbrD9E5xUX4dJM
KsKMF1qqvRFxc49BPeg4GU53eN0DLoJi0TqLHv0VYRwOwD89h40gRBb5UIYO
zhjPZN221v7LpaONyc45xPAlqKxVfBRG3APAX+dtMGCbdIpTBKrGfDieDmWP
XF2CB5Lyvc6Zz7rFOBGK+Tl3E4dWcSjTYSf5lxwORpddu5VCyYZJkol6ykB4
y9tlxNY1u4UOZsyfvw1U9okvWv1oALvrzaVkEKG6GXQCBtqwGf12Xb1pOiiZ
LQmYN2gSIo6xwErXYgzRwst6H75v8wzEca2Z2e0xZc1Ym1jYlaxIQYobgn0S
xatZ3dfE2RF8poxHtizvcc7vEL8XewxvbN7WFfGV0IMKKtcW0Vb1TlvTByUF
SIRgEZU+RII6xIx02qaSt9w1hU4YwwsdUxddridhXNEqvOQhnaaE8l2C61I6
pLAl0XTDYCtf1tMZ3lh1szh3SSu0lwBZ09PwDZGWn3IxWL3q2znyFAGbZ19I
wGpiHzaTgAhLzWzAGQHRG4zBmiiMz+p+Cs51rp3nkyEmdbjjZ.5ACAiECsFO
FJhl.rEK1X8VACYxSufns4UvSShRVRxzdJ.SVWLLcHrFOQhdlEKjMd+cieEY
6yWU4uTNqznsXxhvPIo0A4enFzN591RhhZGSUFFpfGTKplu7Ys0WpDCTThcl
HI13iyOzxzwfphLzojnPuVjnjjHcbFOIpIkwbvjS+Wleis80iw79jkLxicXT
cGLs16TRmt.KpU.2hVFO5rIzAGJo2I0Z2yDhcgelMW0pq8CnWbqGvBNZvR5W
bVvBLo.xFFqIlDA6ZBP+aER6o+kLNACAGco2.wzdnb4JTYtwiyIYhytruMAA
.GL13l3E72COmoqP7QXfUiMQ5mvrLAPWnH0R+2Sz78DMeESzbGatCdboHc2U
JUSnHHpmbanTg+O7FOUSG8mpoDCQtBLz98TMGBk.xB17iXplf2boZZeCjpYB
tnHbC9D9Tq2GGyhjiwoF+BnKVlNSBCaz4qznsmy8PGTfk6cF9Rm3.Mwxt2xM
Bcm1xMVponCZJT07Itx7p2YvVPuKDvaLoYacw9.LVhNsQFaAYRHXL9.usqVi
Sip0XKIQ6a8N2324FqHaD4bjd3b3qDmiNicI4bAsObtPfNJyrn5jNHTU8P8p
.GaTG+5j.aCRfUDaa3jAfimhlDIAR1YmVU5a0zA9L9kQkUU4VXd5kqRVBkfK
vpr3dNmEbsuMH.CUjNo+aNBvvol.b456EgOhiVvFAl0eQHklSVtmJMGMWu+6
cosyuz4EDuuSgXfAuuAkQAXYXbICm5msikUtJkm5IRZT1SFkW9v5BVr88rUi
Yl4OvkVNwEVp5rusLKOBma.32TXHu+127Koq5bm8A9CS7bJ2AWIsbGKuZxmN
.jVKyE24cOoCXv18Ry+5xUe.nLArC5OP45bvkbYk5DFZyIEV3tZq2UroSnAp
X8OlDmCjkvgvW.KHGM4VLbQPX4zusdJX3dZFiwKYEepFMOLsXcVdxBd5.TdS
EIYYzsKJ1FFwzO9TO9SrPra7E06PU6CgLpiok1eekeN3xweawwOE4KYb5Aq1
C0WaKPZFo.afLVGmERQPlKhE+ucEKCn8Z1aUR7Q37Bbc0ZzrK9jgFna7ozop
rlc9veRKYW.BJKtqy6Ur68ck31rhcAuNUrq7H6I8M9gnjcduVmNTuxvJuWxt
Ac0bQu0JYWvatSGpmhRbvs8oCkQ9OGmxyqth9eu4Qq8zngtxh24ZeKv4jZrT
7GbdXQWU3y6rvywWkuoIFyjaptm2YfLac.Y+cBllmYzU0fsGSw.giDT.xcx0
0Qqm3xdqEry0nTv.anZm1X8TEXVlrQR+748sE+i53VewldKmpeei0nou2MgS
C6AmmeiM4XD69VTd3SKRxhvl5ARf9WeLo5jWKO1bvytkrmBJjD0fCwKrMyHI
5bL+hRLZXlP8UEDqV2zIDJNkLwIFqoTb.1ZSb7UAczlz3ofz3qUoA8cJMIjn
cYrUgJcdCbj+eZP0usYUe4vnLoRO7bV1fKS78buG3x9wlK1vJl.H1O1c2D.I
oZFH1SOw2tBpp6s0bJGEDG8IM1JgN5aVksBhim1jFDPk.f.8IOpHN5yXAUZ4
J8AOP+aL4QkUrft5SdTYxNzQexiysUvGnJS2Czq3.NG7nO9W.UbeP2dhC31Q
bf5y6AnxjKH71RdzHOLfJKlBzWvvilH2i7nwoWJy8QSyuTPbFq0RtMBGUaet
fbTM8Opd9mVK+9piOab917+GE2s8X
-----------end_max5_patcher-----------

jit.gl.pix を使ったテクスチャパーティクルの描画:#jitter #max6 #cycling74

jit.gl.multiple が重いのでは?という仮定の元、jit.gl.pixを使ったパーティクルの描画を前回試してみました。今回は、その続きでテクスチャ付きの画像をjit.gl.pixで描画してみました。jit.genで生成したパーティクルの位置をテクスチャとしてjit.gl.pixに入力。ピクセルシェーダーが位置テクスチャを全捜査して、自分が描画対象だったら画像テクスチャからその色を取得し出力。位置テクスチャを全捜査しないで描画する方法があれば良いけど思いつかなかったです。 スクリーンショット 2014-07-15 1.35.50 パフォーマンス的には、解像度720×360 / パーティクル数500 / 20fps 程度という事で大した事無い気もします。アクティビティモニタでMaxを見るとCPU使用率が20%だったのですが、jit.gl.multipleとの比較はしてないので、そのうちやってみたいです。

Continue reading


jit.gl.pix を使ったParticle生成と描画:#max6 #jitter #cycling74

スクリーンショット 2014-07-13 9.09.25

スクリーンショット 2014-07-13 9.23.19

スクリーンショット 2014-07-13 9.42.57

jit.gl.pixでパーティクルの座標値を生成し、jit.gl.pixで描画してみました。GPUで処理されるシェーダーだけで完結したら速いかな?という思惑でしたが・・・。当然、出力解像度とパーティクル数がトレードオフになってました。パーティクル生成と描画のjit.gl.pixを完全に分割しているJitter風の描画方法なので、両方まとめちゃえば、もう少しパフォーマンスでるかもしれないです。

jit.gl.pix TIPS

  • dimの値は、in1のmatrixサイズ
  • in2 のdimの値は、別途paramで与える
  • in1へ一度matrixを突っ込んだあとは、bangを送るだけでテクスチャ生成される
----------begin_max5_patcher----------
2924.3oc6ckrjaiaF9r5mBTpxgt8HKS.v033pbdCl61S0EEIZ0zlhTgjpaow
kOXeXpjbwSkZtOGlK4TdAljJuKomZli4UHXgjs1HIjHEaJEYWVxD.D3Ge3G+
aXQe3hd8GENmD2G76AuAzq2GtnWOdRrD5k9bu9Srm63aGyKV+.x8gidW+Ahr
RHyS3I6GZ6NgDGCLyx5lvfj.6IDd1+wHOa+rblZm3bqWv3qiHNIh1VWSanx.
.RQm8kAR7vPEv2j9Ndt75g1zOGZkUQgyR7IIIKlRD0R+94km05wdeKOCHq5D
IGLahW.8c38E3iIJpIQprD+3EWv9XP8.koQjoj.Wfq2DTcfELjCKPEkRwkiF
Xw980hIwDyAEzPshACDtgPCTygFylLhDUqdN1f8kVorAHkGqnHZCjPhtlDXO
xm2TJEgJdAI8G.5OxNXbSvtfZN1k24kLbhcRj2b.DbCUPSBFAfVHE5DBSk8B
OgZVbVHUS97Jc8RmWgJjUhRZWKHMF18TgaNgSlPXCeqAb+mu66AtQ12CnLBI
dNTFf8AqPVXASGGxPPsRwJ071HZ7HNCWdue+AEklkYZr+vorQr8mwIELfXbo
fAtTFmw9WyHqYQjcm4Y6RkPKS3TQMBzIEdnUrmO4NRTrWXvRXcu91SmtTx8V
5UXX56B4Uj9f7j7BDIAySJhbmW16ajmpcDE9RnXGqKx.k4l58EYRGGuH6UyY
zL4yF0UE1.nwMBPkIxKCZni4icB8Es9anrVVCV5C3pEzOz48D2kj4QGFnZi8
BnZkioSWrSRI37rcI2XOyO45sO.rZ92X6PJ7k2J6Tu9ii7bCCXDwJuIK4rli
wgw4rzVtyvKQf8zs7xwz9wr3Q1QrAfTY7nrLSBC8WMq7wb5jG6.OprKRhmfX
QJ4Up2joQL8AK2PBUH2F6DE56uRUIx4tsjiKksvgbumaxsqHJfkCs3dSyFB5
miQtdiIwIqlVh833USYEqVWlecYoBqjdYRGV25DpVStIa.Uf5xEo3g1hDcJL
jExEVXottrh0kWfWt5J1rkRDRrofh0xXcSX5kIXMcRYyCmdA.Xs.QUwDBN5g
0qBCQGsXnSnKgUx5fUBKCEepqxMVDSsStPzR6.fVvhQqkxg0a4jwWmOc6kuM
5sAr+4BdE.9hKYocEOQWTdJOGdUd4lFFSS+NhykwTMRSFNG7LVEMb9KXetXf
H0EK8BTSHeEPI+4aBitjmB3kf4f+.07R12e0q.tCmeEq.efWxDV4VjVtEoka
gnbKtRTjzR91jLasnEO1dxTexkdAvALhb9fEWc0v4KdYdQ4jC6yuBbI7E9jf
wI2dIsW87rJ4pqdwzv6uLMGNfL.MLEUdaxGo0B8+7wr9CEqghZ7k8asY2nZw
wZYszrakplcCOEkPRawZJhTLgGKvRgOhkghanTqdSqU1BL8nsK9dAEopl2SX
4uc7KNbVjS1XapzJvpcJpYDIdA4Vx8l792Zk6VOW2UMbRXqQLyxE2h5DCpME
Ckjh0ZHJF7MW7XJMpCS244RBm5aGP.26E3FdO30IQ1AwTQiStlYPcB.UKOpT
ElGoZTlGU5Gudh+0ohz+se3G+0+72CtjgqSGFeq2c1O7o+wu7y+zCe9KO74+
5+8e9W1KXTEgDS9wR3ktpRWwKcFJbyz3wy71udMTzo4NNZJjBpUfy3ZEGPvm
PNFVLysGS1fiYR7dAHXcw3eJ2.ODoPyBPDktWHR2tLHlKpTGcmLsVXhJWPS4
w5C24hgdQhTdLPVfG97e6W9W+6G9zO8vm9wUEy7vm96+5W9xu8C+bMlcoJhC
i.DYA7ZqAcFVtDkrvkf2BFhTeBiEXZfkw4AV901t1Sezfr8hUCm5ypP0VgAp
uiqLqHQS2Ly2O1IhPB.+NXMXrzonDRCaonSkcajEnjshTZ65zR7gVRUR33wO
FP8h6iJO1GQkurM568x1jWcs7x3AHwN62xYgY5kVFaDBYPvBvFiBG+KY8pJf
GPY63xwcny4xazEJ3T47YplJmiG943gKY3IDyDpJb1lBezPhuzx9rn3LX1eO
BlvJwHTX5Cuq1NwhIl3Cxk1rmA8WfRPQbXTw0Kh0b4aC12XagJDmQsCd9dxh
FALgh.aas9V9X2BPX5dbXyuZ3.Gp1VQDCIY7kLO5hHFpoiHVp98X66HtWSaA
JK101ITarGMKQLbrr995pZqZUm6f79sRDkz3E0nTS.FY6mZgS96tE0JGjfHl
F1vrnGdSLU19Lp1X5v7qYTKyvEpCTzmFEF4Rh.PVgrsEeubgWD3.pkiGFF4F
dpAKeKbXVtkmOgtmwXd2yvlAwvrUHLCGfkuoxT0OrAFIMUVeh2lBVf9cl88S
li8hvqpAKCqrNX65G3I3t9wPLAzLUAO2nRs08c47l94rSN02ImUCk5pxGBB8
hI0yTUT1X3VkltwVuXEui1HpoGv0lcPmD9vJZOFddYvOiiM7qr8bF0hHp3rl
..U03HnVk9cp0xa9mVxAdGaeB0JQH34JCQrOZDTM0adHRqRX8PrGUPcGXkgp
0ETEhJMrjERUNEgzm0.PnpAZ6GElMVWySRtR196qQlcqnJDcV4NzU4TbCncS
jsSRin6QrDW3J2oyH0SQcOOicZEzLGpopaZn0D.JxjqL2pRFSzooxbufFAEE
67CT0adb8SQT7NhCi.sLsLAFlCQXrhR81ztXSd.Pfh8cEThckuwIoQQ268sf
4KZDMPBnTq5I5lmhrntgMh9GDDKm4PHqSQ9Qmv35cRaD6B+zCpjUkrhvy5bJ
xv7LPrZIiJmlVBkbe3Tul.H0DllW4gZ.Zcpp6Vg5uMPoI7VTbbkMp9X1bHNI
h3ie2bfhXqYoKmWNPzI4b6lHJ4hi5U0Jpgmjws3ErKzCrdSvKJhWtFpRdwSR
8Lhyp8j3l.Iwh0eP8+KOCh0NRZoZXD5rMqBCsNGFsRL4AAkS+h44fnIAbJcL
zLN6NSgXnrQP6b.zj6TuatawOS6b3yJ0bRYidF9bvyJbJtzwN6TjWr92ACBT
TCCOsuCFrj8FMPoyrkyMkjjgVcFR13nae8qKIEazYnXMYuNQX6cB.raPyRe7
I5NbFaQRPAy+fcGZdGNkJcCNCL7n6xwAKKigV2gw.2xGeo5SwHY0Xiz6Nzrr
prQcGU1Hicgl6FBMPxp0Fo0cvYokM2cjzsERo.IccHbVVEJrEKrqvOqrKzbG
Amkjj6NRmgRqQAdDRycG+Vg3cwAkNBMi1Ei86FRMfxJoq6Hz.JsfNzQ2I+Gp
z4uLLiHArCnd1QYmefzU.ulDYGStleVUYaZG1wkIqFX3jS3LwwqTsFW0ghKB
Cn32e.8BNAxc2CsdQWvefQ7+xQvZbx9gV7uLJ8RD0nRzY8uEjUC.YpMGj8ml
PRhB2yetkRQKw4XWu76Jz84p2B0Qt90RmmT9MulVm8hWqFWwCYW5ko6T+xuc
Gfv181cXRb+mDz.mds3V9kLLtkuqKb8lzxvQ1O+Qvzkgt7eRedZgCdSr5JXI
Pm0s+HEiJeEqjxG1Ms2XSaM1XvRVxwTFxYkv.bPIGCIHGyVkZv0jZl34NMjJ
cNkcApXxWQagBApbvrGdrYZTxGVA4i1MxW2ZnIl9Gc1FBK8NnguD87mdh5Cq
5Y5N0IzT3i.Pc9nB+oCTmnxIY63Hgf0Q0.tD8ye5.Q+npnekci9MsFB0o+Qk
cCNx6KobR7mN.cBMIFDTaMQKp5xvSzdh5TkfbLZMpAKC5fZOxQlwJXqQNHYj
mr5hobXoGoFsZOiHPZcq4VHY3ev56nRLcUtPSEqkjcxe5.H6TpdPKNAPQFFN
bGjdZGi5QRPNVsF5.kwkGjR6QO5Mg4XMH8Hyjq1SZNDIqGpsD8.6VbyxLWuE
QmlXvZ6pVTS+wvK02BKKIbvSDdj0tKOYz9Z2gmqc+ct4c2YQ2amz14iW7+fx
bUXF
-----------end_max5_patcher-----------

jit.gl.pix を使ったパーティクルシステム: #max6 #jitter #cycling74

スクリーンショット 2014-07-12 17.53.52

先日、jit.p.shiva や jit.p.vishunを使ったパーティクルシステムを紹介しました。パーティクルの数が1000程度で30fpsと、あまり性能が振るわなかったので、改善点を検討しました。例えばGPUなんかを駆使して・・・

そこで今回は、jit.p.shiva パーティクル生成システムをjit.gl.pixで代用してみます。

スクリーンショット 2014-07-12 18.01.12

パッチでは、jit.gl.pixに超簡略化したjit.p.shivaの代わりをさせています。たんにjit.gl.pixで生成したRGBの値を、XYZに見立ててパーティクルを描画してみようというだけですね。これでGPU上でパーティクルを生成する事ができます。ただし、jit.gl.multipleを用いて描画する関係で、GPU上で計算したパーティクルの位置を保存しているテクスチャ(jit_gl_texture)を一旦CPU側(jit_matrix)に変換かける必要があります。

描画した結果は、1000パーティクルで20fps程度とこちらも結果がふるいませんでした。jit.p.shivaやjit.p.vishnuを使った時よりもパフォーマンスがでてないですね。どうやら、GPU→CPUへテクスチャを戻す処理が重たいようです。CPU処理ですがjit.genでパーティクルを生成した方が良さそうです。

もう1つ以前からの問題ですが、Maxのテクスチャ付きパーティクルを使う際に必須であるjit.gl.multipleがボトルネックになってるようです。jit.gen + jit.gl.render によるOpenGLプリミティブの描画(LineやPoint)では10万パーティクルの描画できるので、jit.gl.multipleを改善しなければ・・・

改善案として、例えばjit.gl.pixでjit.gl.multipleに相当する処理を書ければ、大幅なパフォーマンスアップするのでは?と思いました。テクスチャとパーティクルのポジションだけ貰って、そんなに上手くシェーダーをかけるのか・・・?今後の課題として取り組もうと思います。

おまけ


----------begin_max5_patcher----------
3073.3oc6c0zaiiaF9ryuBUidnXZFuheoOJ5gza8XuOXQfhMsilQVRURNIyt
XOLygh1doKJ588vde+Crsn+WZVzdr+EJ+PxQxVJl1hVCUyLAvZLkkzKe3Ke+
3gTje8ESldSxCz7oV+Jq2XMYxWewjIhh3ELo76SltN3g4QA4he1z4IqWSiKl
do7bEzGJDk+u9Ce6uKHqHbdD8+729t+8e7as9EuMrXV5r7aCuK3wO7C+zO98
O9w+xie7O+e+6+opqNdy5jMEQzBw81trzkYqtQ78YUkDtP7LRt4suFaWcwKS
hKhCVSEm52jEFDUclzfh42FFu55L57BYkC5CY2MKnmq3.fHNvdBVe4SxRXbk
n.p8LxC+Jwy.vtC7R+lKtf+wkJBX2HjFZV604pGjrnh2mRkx6TF3c85fhrP1
89K2GFP3moxRb8mQ3UOGQsDwARl3S5p1VAyaQyEz0I2EtflLiUUXOfomP8Nl
dOSP2SOgqTrhF2NZ.U.MtzZZqHBDeRJFXODGcPtX9AL5zzKpe+YM0RToDVX+
5vH5czr7vj3Z2jISCRSqU7jZWBGKeah3F4b41hBikEA1VTF8tvpq2caoAYrZ
YAqJtISBBO34LUdRV62EUW5S8M3UZG4m1BkELoFDvZoWMOIR9reCqao+k09.
z7GFkL+czE0zpXsloz3v3zLZNyvQPQo3t8zKnKC1DUbc6XZyyuLXNsyKt017
ISWkEtHIlKDMtRdwUOt2XIMH.H0qLheQbPZKWbNqdrI+lfLN7eSDslxKSWOI
Ip4o11hy5xDDGxzjoEgRgEZu8lFtNMKLtnwChFGvtG2lOOKIJpwsRdl6Z4LK
XJEyo2Gtn31FlQ4mg8yCSqZBltEiVDthlWzrrhfU4MKogyh5Zq0sEzn7mylP
S6BLojT+DsZlrciCaMGrqIgF2vt0P5vx.vUX9DgEpFn87XzoczN8bLoxJZYO
Q8ihLrwBzMLZ2NNg0ANgAdRCoGFm.GGN8TOxnv3tT.EBF+7sCf4IaxlWovTp
aX0TDYcNJBi2Ze5Mawlc9c2FtXQSyAxdP479iRKesVIt3oRzmqzMwoAyemEz
5pjkKyorVe1eW81MqSsPVn18xhTyKqB9bANmVvXHnrmkPWA36NXAiwgrko4q
1DdjAfzMDPNMHPZawWDugmckElyN.7LpRUs05NvL.5DURjAlIMqPFt.1et.W
ilIBKNMJHlZcEutXU9+C1Tjv.hv4LqEWkuNIo31qyuMXAqRwKIJb0sE7Jnzs
MuH1g3EUem0ocAMkcMUmu54yMoMOYiLr.r9abfmTiSYFFHWfLCCjL1wAn0YM
MOOXEculm04GYBVsCG18QWEfj8pgbrgq21NZ.O65p7fKYgntNUGXRu59Bbjp
FNCV22tHnnr+aZ3CVO9w+5O8O9mO9gu+wO7c6PZQOXl.B5gm.nqL3IYLTHUv
opbgPsfcP74w6.KnhkQIAEHnEv11darl5LO99ntAI9x737GL8stLHsbSTDKa
KJM15mCzQ+PXehzffsmAIHeaGV3FkgccT1mPmD3TjrZUD8Hq8hbfaC.bNb0z
9opIzVMcfzfLFVVPyJ88tMBd8z4I0hkz8Qh.2DDupcHv8DI4h6QpN3fkzgBN
Dkf6pCLtI5hTinKrjnKO6Oye0m4uRQlWjcTOZ9U7N.CJPOA4yPn7.o5S0XPo
JfGQUcXnYJmFYs0TT29+eFiaW9Lz1A6EcTkfIPRD09D52o+tOgz18N566FLw
OGXx6ucYaG5BbAZAbABimjxgYRibhdV35CnHWePMw02k8VhgJJwd5lcxR+64
A2QWbM6IvZ4uNnfEv9MaJjMG0822WWaG104QXuuUg3Yd3c8PYg.bSPTYDNau
1VbqbVHz89v3EI2aUd3pk4La6aXdiEzJwjVdfKVHGN+QIYKnYbliVlGDHOV+
G+934Gc9Y6YatgoCu9j.hKbavmD.ZvROiq71EauUOF9uQNV8BHc5QkVF9z3.
G.JyK6IXAPrMDRNWy5TFlFQ2pFVDjshVzAemZiJcbeFMArsWM9h6FDgCEHld
RjouJ5Z9MhmPSW3jeuXHQl8OA7BbhN3BpMbKNNBHv2G+4Y5vmyTT2YJ1jE5l
1GhSByopkD4dDNK68USA65co2P5Wwt7iNmZDd8KO.XkRTqts58P9e4HB1Qxo
YmzbxAwc2dg6HaxSCmhIA7OSxsor.HX1O09j6gnCjDSjgggFCHIT6XXOm4Od
BpT8jtUA9igYHU97.wvuCrds8LH+C8qYBzglYIAV.HYLvf0SvJGUOGfpsFbX
45Ohfz6n74RBSAEPrr0Mbh86WOeeYOeOfz.vgwSzmb77WpcLrewPAj4s5Ksa
JmzHltN4qNGcswt5.GcjlMQ3wfm7WwRlT6dy2xD0IZhj4FmLxvweMSeDocbD
qC8QW4zZE4MFvw76CY0CsCjHc.jdxoIL1YL3jgmri96X2yQDU9N83JQP7nHU
Gs6rF4qkN0N3wiyZttH3Kzt1Hpmg8vBB2k6mwUnH5hFEjG8aoAYE8g7n5.nV
h2gTle33fDne1q0tZHQKFEsGQQey7R+UVuW6.IVGgMRjSqtwg2kyhWZjVh1w
AMh7RKTHeP6.ITK1GGSJjuR6XHPCzkgcgiGiiwIYq0NJZqElbskqs.ih2f3k
YAyKzBN14vkI4WPphcnwKCh0xn7HeW.FKbCgQtDuYDrimKY.ZJJmRHGroPKC
3FzS3eymLJ7uEFOD3OwVI72QK3OVNLcNiA7mODHrmlumumkq2LHBYaCOqsHx
gx.HGnnC1hzyAyu5g4U6kGcTjCxCue.5VnZifmV7Q61wqYtI1sXQxP3gFBvJ
g+9ZwrjbNDLNB0bdRttizD1u30wRZI8kA33+Rx2ZcPTGyQfJPzYbDqXw8Iog
5FHA95.HIxzdbGKQZXyLyo+YZA.oiLwkSdaW6wvXfouTHaagJ4DIERNO+7cF
Q4ApcHTGbBAjqljiCG0egkCgfbzNPZqCcQ4j3k.GEDlyWiDrVq8vd.5.HkKM
eN3w.8ZmCVJ0gyZ45AgJSVE6++z+hNdeHPPvKZZFqAmtZ.NeQRUXMLzQGX3m
o6ahNWTX88dYSYWKqKb8JZxWhztouk5D3ni5rOIKPwkSzdh6nZAJV0UnX9P8
aALhksD9jrTsUUYrwrTqzhnzgLiLmkGFUk4VTh9joa.NFbVE840gKRSBiKJ6
vg.bCfdk61ERWJhu07Yd1qnjiRgBZDMNp1uk+V3YJ5S1pJy.iQlIJuRT4YNx
rp3LvbvYfxxr4rjeoppAvb5BhU1cumwDhRKdweFY1PvYuAdypPCVmUcEri+x
eZJvrqpQbaNQBhTNXCGyAmcTEmIlSlMpZ1.YNlMPdGCNaHxrx6KOlimarp15
DoGO1zm8GeYPhviPY1fhDEcLLOYHLhnpuan4zGDppsNn4nOCU02Mzb7o.UMM
En4DiDz6XzmMDYV4TXQFSePfx5FFjsN6iAmMCYVU0Yf4nNqtpg4vHCP4vMLm
HjFcKN+.3wvHJXTsgBXNd.UMPCyg+H2AdSa3xAaSvEpI83yzlf6pnYYzX9lg
P05UuXyOvVma9A8YuOn7ErEr+TTcnWe+KrtQ7GMKHuiskM7gfmcOJuWsgYt8
Ayjqpxttepgre+ZZQVhkmt1B2v8.T.x4LtCYv1hCz5F3G4vUP31tHFvV2WTR
vBoVtdZ56yFDpzDhisYtwo7ztuqh6ytfdsox520BOuYfFKBWebvAxoWaoGku
vm39aqTbgMmEaRzY2HKJwnCLyj5JtXb83I1OVh8iiXuVKUkGfipxi8fHOtMp
4mn3ryDehfm4gX+CxeANjuAGXwbgR7smdXZqRfTATgCJlB6ozrCj5hmw7053
f4XY4DoWN+Z4e6L.oPEPT+ACQQJ0Kd3ZgE8hOT2F3v0KtIwZcgONCl7zjr8t
jGuASdvNlk73oh3PFTCVnCHNdGmAKewhvHb6KDY0WNClpbU.LGtlVUz7GNCC
pX2zcvjFeUT6QCmWEUDGvvYDGXT9bUIJlly8yiKLFTYNSdyDwJ50ZQfRxWjA
6H91YvBxNUCEFghyqhfBRyv4b.pTv0Cn7nh8d3oFqiLgyc1eH4hxN6Kj6rmP
t+9AYW6Ejrmy2bw+CbP7J8C
-----------end_max5_patcher-----------

jit.gl.pix を使ったnoise生成:#max6 #jitter #cycling74

スクリーンショット 2014-07-12 15.47.44

jit.gl.pixではnoiseオブジェクトが利用できないので、こちらを参考に実装してみました。

jit.genコード

スクリーンショット 2014-07-12 16.11.36


----------begin_max5_patcher----------
1602.3oc6Z1riahCG.+bxSABsmVkFgMX9XO084npJxAbX7TBlEblYZq5883d
Xuuuc69Zr9CfARfIDBglJ0VofFaC9u+4+eZ3qKWXtk8Bovz32L9fwhEec4hE
pljMrn7uWXtG+RXBtPMLyP198jTt4JcebxKbU6OR4qiSVmQewHkQKH+2e+O+
6e9WUCaGKkmh2STC82yo3jpdROrmcfmP3pGuUYqYXd3Czz3M4jPtV7ftqsVY
.8T+5.kWrsWaY7wpoHOdq5Qr1pwjtCGplT6FsUP+hpMnS8PERAMsRH.kMRiT
hKa6iuCBLks8skKk+rZfrJk7r3l6DU6w7bApbL1kvvbanA.5aYD3ZcoDC1Ow
.tn0HAr7ULCfBTnypIyZPC.rlF5GO+yYD8CRJwazRr4JCSy56+rXaLTaOon.
GSNAa6NjjTDlSHoF+B3RwD3bJVNBXAQ1AVtqLJAVPejxteR0CafcvFzXfCmE
GmPF6ZD95ZTpGbj1PFNWPRNIeCIEuMgzzf7jEJU3CX35AtSn4SlAoHbB2+c7
kVIMYi16BDLh8+s3z3d3hUGbwyrobQxKoQINDSKMg7DIufxRarJVXhyxZz7h
F2hjgOxTOH2U0MQS0MApaJm7Ds598paEmKnCWflC4Zj9hudqSsusr5VqUqPR
P4pbr35nznb7anRI1giSXgehD0..BpkQRooY4jBQjDLuTJp6NhrCeHguoauS
s6ux+dmc1ohwBy3bZDKUJDstSYyUSmv4IR6zr4hQMhTbVG2bgXcbnXKNWR0R
aGXUmbFKocW0ajBK.bJU3akvoZgEZU+Po6yxU1YMlHso4CBGgrjjVOJcOO0Q
OQh85PxyzH9CshPJ6QLbZV0VfYMihnwjBd61333h1szJ6glJgMMsa09Ql3Z6
mpmWu4CzqaMeGkkJTeAU8a8VVeNmN1PzuoHTkhiZoV0rx2UocvHWrs7m01mV
AIwn1Yva6Xq+b.NCk.1pvZN1G63+MRE3Mbx0LQfdC30cBA2dd9IxmGKLcFFL
AJuchbpPWILkF3q55R+v0pa3B5Btu58Jgl1mwpZcJ6uapWvNjGVIu5swUFsW
wBGIbZZsu7OTaVcz3dfFE010o1aSgz2kNJwfzPtTIFLPIFNQRrwGW1LnoYA9
IRzFwLHTj1f4hTo2dfq2NZFu+ZCsc9PmWf+9NEh2Xx6aREo.rEmTlgS881QX
kkuBwoqRqmooQrmMJu79cEBe6GDQiEayuWJsxDWLrcE+0VVdDI2.HGDFquVO
3pmsTmKjcPGd.NcEqUlgdfWcVn1nNJxcfErchG5ylhNveLonK0jOPGax3x6V
MVM4MeiRYAkEo8Jd.HqQWO6vwhi6DW3ebx5mnQDVVBNkTqUhOvYhj.ogRsRd
NNsXGKe+FYFxbC3zel.1tpnX1kINMmmI.vY5IZlTHlbFAUYJg.WEhhS1HkVY
8TWDlB9AuxPakAKBppMzVa9Za4zt1vPVhd1+fnnjfUM9A7yhH+YQjSPcUBs6
8isR.vYpDPGdVGXBc0EUc446GLSESsKGGxuoPDV5ev4VRwdK8edn3uJp71C4
uF4356gto3D3qhYEf9NfSu45DSno2VF5nUFc+NvP2YhgOQBkRefefugm+Zns
skE7FQ0.eIH8r0mD0Mkp8b1Sn4Ry7Y5WLd4y2TsSMGcB9NnbZOSXLhcai4.r
70k.c0mf286wfJDUCvXon0fhbizTz6R0DGhplyrcflAC73AsuaNPSzEbflf6
BI1efRrycCi89g6XtcGnD6c2Hw1y7AyuZ1d4GtS8qRXxO1rbRp7.u0GBo4Te
V1Ue2Q.6Qe.ZW9wX6OgGtH2Xq5+jbbA4RwiyYwik5hm2USmiupk2AiLuIDY+
wdBOmY.bm7uOKfq5hK55v0f+7rbl8uNKvqGF+r8gYglv89DFNRqBNwa8Z+Ht
V2hc9tdAEMYh5tZmooFQGG0nDTuczhdhTzJ6ySiRbZDhS1vFpzHi6COiz.mM
oIX.rA3Lqv4bhi+rJM12URC3Z2p1SixXB+SklRHm091h+AkufHctBdH8qKxq
gU9zsHPCXCd9T2bbGh5+7sE6L.wwa1jF3PrFgtym7LjcKHZ9jGz8k1CX.hyX
oiNH7QuYaofbzaz9n2l8ouI69dK1h44aK+e.LmYwH
-----------end_max5_patcher-----------

jit.gl.pix でモルフォロジー処理を実装してみた : #max6 #jitter #cycling74

Before

スクリーンショット 2014-07-11 16.12.13

After

スクリーンショット 2014-07-11 16.12.10

モルフォロジー処理は、コバルト爆弾αΩのΔに教えてもらいました。ノイズを消すにはメディアンフィルターより良いとの事。エッジ抽出などにも使えるようです。アルゴリズムや使い道は、こちらが参考になりました。10個とか重ねて書けてもあまりfps落ちないので、シェーダー凄いっぽい。

CodeBox(モルフォロジー処理(収縮))


delta = 1/(dim+1);

outPix = in1;

for( i = 0 ; i < 9 ; i += 1) { x = ((i%3)-1) * delta.x; y = (floor(i/3) -1) * delta.y; pix = nearest(in1,vec( x,y ) + norm,boundmode="clamp"); outPix = switch(pix < 0.5, pix,outPix); } out1 = outPix;

pix < 0.5 を pix > 0.5 にすると膨張処理に変わります。

Max Patch

スクリーンショット 2014-07-11 16.22.09

Continue reading