jit.gl.gridshape の matrixoutput についてのメモ #max8

このような音に反応するPatchをつくる際に、jit.gl.gridshape のアトリビュートに対して @matrixoutput 1 として、3Dデータを行列に分解して出力するのですが、その時に出力される matrix が 12 plane あります(多い)。planeにはvertexやnormalなどの行列が入ってるはずですが、それぞれの意味する所・種類がわからないと適切な処理ができません。

Reference や Help などを読んでもイマイチ何を指しているかわからなかったので調べました

matrixoutput

上の画像の通りです。11番目のplaneは謎でした。とりあえず触って楽しいのはvertexかcolorくらいでしょうか。

おまけ:音に反応させるpatch

動作デモ

上で調べた結果から、vertexに対して波形を掛ける事で動かしています。CPU上で擬似的に行うvertex shaderといった感じです。

追記

サンプリングした波形の値が両端で揃っていないので、円形にマッピングした場合にアーティファクト(ずれ)が出てしまいます。

右下がアーティファクト

そこを良い感じに補完というか誤魔化す処理をgenで書いてみました。

波形を反転して、x = 1 付近では反転した波形を利用し繋げる
変なアーティファクトは無くなりました

Max Patch


----------begin_max5_patcher----------
2793.3oc6c0riiiaD9r6mBAebSuMDIEojBPR5ja4bNNXggZa01Zhrjfjb28r
K1AY2q6sEHmxsMGywbNOMC1.j2hPQRYKYqennMksFLXlo+gTVrpupXwhjUUy
2c2r4OE+le1bieqw6LlM66ta1LVSEMLS76ylu06skgdYrGa9x3sa8ixmeOuu
b+2xYs+mix8SShC8xChiJ6MXEqu3md+WCgkMl3kubSPz5Eo9Ky4CM1x8Ay6M
rA1EeCfMK9Fj9UiuQ7gh1sMHJzOmQDfCMFuKurUyhF+96tq3K2KI2D4+Jk3N
gYBi8V8jWz5xN3iR9GR74z6bVm6ItJrIvoC1z1zhyXL9C6v9E3v3RvkiKeeP
9Cq8iZkIo8uXqWdZvayu2XdyrKnC1kf.UjpV.UXWX0WuepfIEb4r4OGD5+he
ZVgN2g2wr4dIIUZdVkORAz79X1Kx498MEDwaBsuoT+WBN90ReuoTlLmxg6RY
nz72HVyO7ZhW4mFsKXubhIjDjDSbD4s0OKwaoeCBfhwbOzQXpH.S17B.fP3+
J19.7Qk5qCiW9W8YhCyxFiS7iBhRR8ynSS4yFq18J+m81Elu343n7rfukQH.
pPoo9eVPnM1YAqv3h+XZfW3ddXcZvp3nBhnl.on4xg6czY3744UYF1SD4kzv
GlpoQQlV5Lixj6xdxKsPd8TneEsFptdbbX8t1+4B8eNWzcRPTzQnXdbR6clF
rdSGe1mhoctsq2MqmrE6h38tfpZjuHy6k5nctWXnXpa8W+adQAzIl94AbQ.0
fRYm9QdTFcS1xz3vvZ7KumWZnmUTU8k9uFrJeCafppLPe7fjRkn46kxqBV6m
kWusbu0Y0aIK+CbPuRS6dRLUdQt+1D5xEG8.zIIAY4YaheMS7fkJZUAfCqYU
cpcU6f0ZuK6g0sItsvX2g1Owl3dqfmXIzs5mqo03L4VAYlAsLO1X3oFDQ063
30.lUtNfvLykGKRhe0.oHZ3zCZ.sXl.Pb6bV18CGfqMb7UFeMPQzvrGz.A39
BH7OXJfFYuF7sFePM7nuoJHwxcHTyNNbqBGJZ5voWsCvTCNntSsUMvvVNvvV
X9nerv7ZiEu3uzvzvTM3fzGbv8PDZQj0NJ7pqa36kV37fR3AtG7.3xTOP.95
JtS.7HHxP00UjxkC9TEnyDXpBcDqiEUXVK47uhKxQ3ywHoYCb6gMpDFD0l6m
Lxpn+lggr3coKKkpBK+F0oPpG24AQ62116N3N0QOXb5J91gkSzLTJCHMoQWL
2.Z7M5gJbkjJr3OmdHhgfDipPBODJCbkgGb6nioVHLx.HLsANlRRDDMp.K8T
YywVD4N.zQWhHaIoA2wFbjkvF3ZCBXj2x.OH41N7e1AYF9.6H713k3a7oe7m
+u+6e4W+O+xm9g+0+6u8O+0e5u+oef92+wm9wepg6F.r+tApdpjVNkGDUiN5
Yxbnwg42qCjs0HhUkCWt9YT9Dcs83Hi+hWTlweJNb0b8duBOGFSeIGNa7TJg
j6mtfeHbU70hRloa8X7Dosygu3z2a8BGr63.3cfhCahARXSkN.9K3spDrM3i
sdaCYAqi7BajGQt8eoJXt9.xZrtTkBc9mSxVuKnpx6QGYdyBylYRmllDb3n4
aj2sYRVW9l.cLKc8skIAUNndcI5kCUJtnjJGw4PPI6giRN1L3gXadqfRLiAs
OUfZ8nvjPSrOoqYBbkeLoBeBP2JyDJk4VCWlaovLCW7MlLuEihoF6RVUbKHs
BKMBInNu2Ul9NluweLpaKhl59ZlyLVk58ZCK6i5Jj.rgLp2w1husdULqadIY
h5hoprQW2AtsqaE1.iGK1nXNYxqAQqhe8bteeHo+UdsK3GpkFB7ALk4.UXtr
ODs7H9ZDmZUfAKKH6OdVPPyq3f5z5CGYHPqR2Ro.C5ZZ8wKOOsa6yc4jpbFk
1qqTLXb2fKdkLHavPnCBxgPP0PB5LvvUAYIgdenbYnK2xeiAz5bBzx3CUQUr
K5BgpmO7oruPPq48t9OxAMt9Bs1KH5iyUQtK1+SqlgP8aIFYxsDyitfhqDpa
1c6tv7fka7hh7CewiJqixa2i.Ur5jGudcnuRvQPTKRcfDAXmXWf6+5UJ.67V
sr286dem67Ez8Ne4tSPZ4JOtM1i2v82GPFt+9.De6+t12396eIB5R77dOWLD
VpftD9kftrRLIg3ygvrSdjZFUD2ElDyuD0keIpK+RTWddQcY8KOntUw+vb0B
MJaWQD06V4nNLub25uFhwgeihABDruHeQ3LuMGDbYaF+1NxW9JEgBTePA2.N
D3NYfBE0Jv8EtbtbkBhym6JE39hTNGgNg0zAITNfi6Sq.XZIxuD6IS.G+6+c
pFCk8YtvkXyuq.liynoQzFS4B0Pi9VGw0gmyQH9FHfSjDU.9fhKlXI4bEt5w
oWDwMn5QRwynlUz9huVWwIGR.Mea62fnQPjATMzvpWKGN3RONukhv1t7ztHx
7Orww1hAg1yLC98ohtsb2tKFl9CKiiSW0FKa2alJIbbfowKbj5FmmWFGFm1F
C22B.XwsTZwioJ7TfgewOk9ysvwPGoBcbfHsrmBahjktQ.E8ND12RdhvoSrq
ZKmoR9WATzAQXe14INtUlRHSVkba.HtJhG8YhfvS2nR7.NUvCGEwi9RzFB+h
2lb3gsh3Qe4yJluXoCbZAGDMk52V78NL0fCrlx8aK94xM0fCKEgCa47otb01
ICdnZoAn+TZ0ZRhGJtISP+ozJrh6oSG7P0jZ0RtK5XxgGZJCvEW3+TBNDYDe
S+QSYEdYPQP36gWhpuB3y37BGTKWY9bOwvEbqUoNvjHyvkNois5H6+Lut4Cc
GY7q60kxHsSYNWWJytcJy95RYcjloja17tGeUoLXGITs00kx.sSYnqKkAamx
fWWJCM5EgCYoLqwN2zACqrFzHjoILCOfx9f1paICo1SfzEQXO.hvRWDgy.HB
70tLxTPDDMQDPyAPD15hHFR0ZwQWDAb.DgqtHBzPJOL5pzrzfk6NnBcUBTrj
EKHi9BM3afB.kzvyn6ffrDFTinCwZ.DAXLQGooL6a0R6CTi9nHsQXrNUdj1x
iNUgwR6tlsNoBYs0w.MvnZEVZmpIi9djrFBpMpjFYHfF3ljxrGaMM4Emvwlz
HvafBJH1dXkawKbAfS6o9qoJo9KnRxueqm5ugOrwKZUnuwid6xiWjFm6k6u+
tMF.T0UR.C4EFaQR.Cv3qbkeSv4a8y1H3aVDploBei5O4msrEUjldJ8QtiAe
+ZbZ3JiG4IBJ0tvirJZAktK94BMbCL.V7OISIb9+uD0VUhnyxE.O1s4+2wCD
6phRA5hqTbnnQ9HmIoiVRw08Y73pfsT5jT7uyJe46WiARNGP47KHOmeEhw8j
JDCCTkf04I5CruIK5pf4b9rN.0Y0wo85lnHt7.pUYLuIXc6SX8MAgA49KplB
.csDA7RAArOW8q.miHG6hi.W54nh64hqZD6kcjpe1escXN0Nz3i7HW4gt9gx
2uuaJOPXYXwKv3.FBVddiDPhQBTw4a00OjQHcD4T+5SUmIkYjMadjM0+Hi0x
bBYzUqekZWLld.SStvLsqLV6tDyPqsQ41XQfNPWoFYXyiLT+iriNjqPolG4N
VqhU+BltXBVYLPBIZQxJyPirzhnUpg1VG.NRJYs8EPqB4NfQ5xhuRMzHsrN.
YrfWmwZfjAKO0WZtS7GUH2JFhiJfaGU71Nsvs0dQa63B1FqXs0TgZqXmT288
28+gE.Z1C
-----------end_max5_patcher-----------

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-----------