M2 MacのJXS(GLSL4.1) 覚書 #maxmsp #jitter #glsl

はじめに

相変わらず趣味的にMax8を触っているのですが、ChatGPTが出てからプログラミングのラストワンマイルが近くなったような感じ(いやMaxはビジュアル言語なので全然恩恵を受けてないんですが・・・)で周辺環境のNode.jsとglslをもうちょい深掘りしてみようかなと。今回はMax8のシェーダーJXSについてです。

M2 Mac & Max8で使えるOpenGL4.1?

最近のGL3化されたMaxを起動して、jit.worldなんかを起動した時にOpenGLの対応バージョンがMax Console(Cmd + m)で表示されるんですが、なんかGLSL4.1って書いてあるんですね。GL3化の名の通りGLSL3.3あたりだと思っていたんですが、比較的新しいバージョンが使えるなら嬉しいが本当か?

JXS(GLSL)で確かめてみる → GLSL4.1のコンパイル通る

適当なサンプルファイルのバージョン指定に410と書いてコンパイルが通りました。実際にChatGPT先生に410から使える文法を聞いたところdouble型が追加されていたのでやってみたら使えました。GLSL自体の知見はほとんどないので330との違いはどれくらいあるのかはよく分からないです。

(余談)jit.gl.pixのexportcodeで生成されるglslは100系列の古いコードでした。

JXSのサンプルコード(トップの画像)

<jittershader name="simpleShader">
    <description>Default Shader </description>
    <param name="position" type="vec3" state="POSITION" />
    <param name="modelViewProjectionMatrix" type="mat4" state="MODELVIEW_PROJECTION_MATRIX" />
    <param name="color" type="vec4" state="COLOR" /> 
    <param name="dim" type="vec2" state="TEXDIM0"/>
    <param name="testvalue" type="float" default="0.5" max="1" min="0"/>
    <param name="scale" type="float" default="1" max="10" min="-10"/>
	<param name="mycolor" type="vec4" default="1 0.2 0.5 1" />
    <language name="glsl" version="4.1">
        <bind param="position" program="vp" />
        <bind param="modelViewProjectionMatrix" program="vp" />
        <bind param="color" program="vp" />
        <bind param="testvalue" program="fp" />
        <bind param="scale" program="fp" />
        <bind param="dim" program="fp"/>
        <bind param="mycolor" program="fp"/>
        <program name="vp" type="vertex">
<![CDATA[
#version 410
uniform mat4 modelViewProjectionMatrix;
in vec3 position;
in vec4 color;
out jit_PerVertex {
	vec2 texcoord;
	vec4 color;
} jit_out;
void main() {   
    gl_Position = modelViewProjectionMatrix * vec4(position, 1.);   
    jit_out.texcoord = position.xy;
    jit_out.color = color;
}
]]>
        </program>
        <program name="fp" type="fragment">
<![CDATA[
#version 410
const float PI = 3.14159265358979323846;
uniform float  testvalue;
uniform vec2 dim;
uniform float scale;
uniform vec4 mycolor;
in jit_PerVertex {
	vec2 texcoord;
	vec4 color;
} jit_in;
layout (location = 0) out vec4 outColor;
void main() {

    vec2 pos = gl_FragCoord.xy / dim;
	pos = (pos*2-vec2(1,1))*scale;
	pos = (pos + vec2(1,1))/2;
    outColor = mycolor*vec4(pos.xy,testvalue,1);
}   
]]>
        </program>
    </language>
</jittershader>

解説

  • vertex shader と fragment shaderがwrapされたようなXMLです。
  • 上記をテキストファイルにsampleShader.jxsなど保存しjit.gl.slab にread(読み込ませ)で使います。
  • state = “TEXDIM0” のお陰で自動的に dim(変数名は自分で設定できる)に解像度が入ります。
  • testvalue / mycolorなどの変数のつくり方を参考にしたら、jit.gl.pixでいうparamと同じように外部設定できるパラメーターをつくれます。
  • colorはgl_colorから設定する色が入力されるようですが使えたり使えなかったりで挙動がかなり怪しいので、mycolorなど別の変数を定義して色入力したほうが良さそうです。
  • それ以外はGLSL4.1の文法を参考にできそうです。
  • (感想)jit.gl.pixは便利関数などを用意して使いやすくしてくれたんだな〜と思った

Max Code

JXSファイルはCopy Compressedに含められなかったので上記を別途保存~読み込みしてください

----------begin_max5_patcher----------
1013.3ocwX00iahCE84jeEV7b1HLXHPepakVspRSkVo4wUqFQ.mTOErQFmNY
1p9eesuFxjYBCwMgvpHAxla7ky8b+jeLel2ZwdZiG5Cn+FMa1OlOaFrkYiYs
qm4UksOuLqADyqh1zjsk5sv9LEcuB1WRyJ51juqRrSURUveA2tKq.DTr9weK
rSRqXpmqo12AOOz+z9n5LU9WY7sOHo4J6SCIKiVfH9oK8WfBCMWCBV5e3un0
Ki2o1.yd+b9bykENBt06TJA2YXDG4c3kUlUQUT4CTd15R.M9uGFWmw2NHNIo
q.rkPfaGt1OPwW.P4zmz.3DRLWTJj0r7uQknOlKpzuar0rRl5Yje+VkfdrJ3
2kcKYMJuEtaABwIla3njg45QzDTKo0TdABXTT0yfIwcOB+KyyljF.3k.t13v
zwGuaJE5yvYVLJ8h7sOkc2HjUY.LiGHxNJ1x2fudj++SzcSdVI0YxNJ4BSi0
B1VxN.O9n8QlZY8SLdg3ImY7vf2EN5i6AMIJY6M76ffKA.EIBtk.DYr+QPq4
Yd9w1yaGwx3p9wt+oXO3nL4m.o.axHRD3bFFbanqM0Ma2w7ND0vUaxxeUvV+
LXkn.jJrGT4e7w0v9WPPrA.CD9dbnKWw0w9vA96RVV4.VIbhs5r0JYY9vnIH
DtTjU.obbMtE+9wsmsvDNH5nBS2h5RWiuvwfLdJ49TaNr3nIl6Un0le8S88D
Qf8Gl5W7l6C5JDaYeaBARvjUyx3grsboY8NIEc+m+xec2ef9XAqBg8CHvEmy
5uZvj9aKenUMmMweWjgspV.dxsGMkYqOXL1vJonFVUcI89ulUPkKebei6svN
VFk1pg9s8ysZ7GYYfjhlQ0PX2am4x5lw1LSJfvU2fF2Thsa+EZJibQssZ5U3
7fDShm3AxLt1OIjkE+JQ480Ifis10k7yEiQJwd6Fz9pdzyJ5Ksucvb7m2c+c
HxRL59LSjsys2gI8ULLL9PwvWWsS6snDbsR3MnOIJKFp2P6Wg.rAQXb2zKm2
T.RnGHl+1O+BnDy9u19zH1Iy6HstRYnWTTAsQw3540E7iDJ1JSuTfqJJbhzi
YbpIQQly.eF8XFHXTTz4.jYpqiDRH00p.u3qSy9Sns7b540HrhUTKz4aac6S
SfoFH31dFe6BbBDgE+xhSsU3qBBqb2TM8JNv+V3dfcITa0H3dPb283pzSfCg
zcILuNKm4PBNmlFkzgNX5HigdRcPQc4lutbEXWhzFCVJ1EiW2qyIEkypq+NU
1zJMnDc6IOJf.ujEvRF2tLBVJoem0IOA1ISp6TPoaSvLkfooh8w1dPfuWijq
mt2l+PCOsJgVeLMfzT2NnOzgz7eN++Pgxt6I
-----------end_max5_patcher-----------

外部リンク

テクスチャの原点位置・中心回転させる jit.gl.pix #jitter #maxmsp

テクスチャーの位置や回転を行うjit.gl.pixを書いたのでメモがわりに置いておきます。

<pre><code>
----------begin_max5_patcher----------
2070.3oc6bsraaiCEcsyWgfW1llJ9PulUcvftclESVL.CJLjsTbXGYJAI5Dm
Vz+8gOjskrkrnRDckK7l7fz17dO2CuWZpC42uYxz4oahKlZ8aV+q0jIe+lIS
jMIZXR4+OY5pvMKRBKjuroz3mSm+0o2p5hEugIaNIMLZUbQgEXaWYgrEORnK
mkGufoFAfM9N6asvdPwu7rE+Dx+aquT9dnqWQnIwL4PA12X5Z1gsRhjiK2V9
.LX6XpdcrWxhUC3zoVeQzyOt4FwOtUSe7qD1cYOSnQoOeBuAZGbmysVNPfvO
7kdiqcWdSwKzEs6cvF7N+V8NtcNaUHKmrY5suVeMjwxWSNkaBbEtI11U3f.m
AKpA2NnBSP17l8lQd3pXVb9rXZ37Do+ZOrwXs8aDbf8azQ98KmQ+tk4uBJ+x
j6xHart+y+88y9i+5Ou+y+y8mZxrOPhOdHI9fceM3SS7cuSx2WlLSXzqyiK4
7Usv37ROuz0mL8ARR7Sw4EjTZEqfi8YYUZdRk2h.u9Zp7Cx+1cMQnplb10Td
7Sjsue7tVCy43DiCRBCTxocwS2+wjFEmS4zNgonZjG4JMIYLhxi+EYgKh2GU
hoa+.ltG8cgRX2qD188jYVAPW+8A.NUXYR5h+KNpBOhCqYwTBMKOtHlxBYkt
vttiheHbcBa1CoTVA4aRCAHlCzP+OTZnM1ovUjdwumSBS14CKyIQoTgQTKfH
Zd6vwIWNpIcUcF4qfFl0valya3HSKcVvcx0EyCyEwqxIUvscxRSSp20t2WR7
CrxtyHT5AnHKMq8NyIKe7Du24o7NWcpOaYOEyVSU8NiSMXyJBepNZyBSRJmO
W+ieSHkvKLDyHpP.zdWmpDKOVrHOMIol+p54oF5IhS0WD+LIh8nbfpRF3ubR
1VRzzcQ4Hxx3BV81XgKKp2RA6EEnWoo0yKmJymmuJKg6E0eA7IIjBVwioOWT
9B2RzpB.6WTS0o1USNVq8Skjrdhx2aAq1dCIFwH7cd7LiPrbNI7nDislbr8B
HGljD3U0HZqzvjskGJSzL7nwG6DMfxbGVXvNXX3AC2wAX7T7BKvtE.2Jf33b
GjSOPddpEC2Mh.6Mh3LNPj2qG4nDJfx0SOzPA9BAJbUYK3ffwfBz3.J9fdrB
iBEvwATT7L4aVunG0.3VlI0DoPAiH7Xid7CihG1imRJ1V1ZNgwKvXUTBFG3g
7KHa8RmHBFI+BDPaIv3pwpNr6Kh3OlPjMchHHWO0pRMHj3cQkTUNYw2wX4Pf
tWT4TwlFNFIqIsfllupSzPlCE4KQCSLUYjvMnwg47umt0mlmtlFI1dJqUj77
z7txuJ4IN.PkBwCbEmQBcgP67azgTEb8q7ygkrLRVbFej6DKJIFpUrVVD9Ul
GwtYv.OsAuc+tDlPnss2ORyUzeyvPQ557EaA0s6qfUcSOhOYgP2soo+6NpJ+
K9qWTnuFATWiPrDdwKzLVgitVgsAsh.cMBrAMBwVuomUfLHs.3zGrvXVAVWq
v0jQDjlVQfIgBXOLBigDf9vMMlUXqqU.MnU3qqQ3YPivqOHgonl5lpvnYM6Q
oTSYC5VIsghco4QpmsL3mqk41tkY23xhtYeK+jEJfXCHFTgB.BtJTfqBE3pP
AtJTfQoPAdmEv8iAcs0A.e4tx5o1UVrsA13M7HY6CdmUmnAVokLkjxTItFXv
.ELVDNQcUKbBz.s8wfZ.pg8kB0.3iTarji4nF9WLTisnABXLpAZj7vbdWWa3
ncfRBINFSr.H2KCIjf7UJVVQNLCT3bYvJPtlmUfuPfhxkXXTrXjnrnBBsKzH
P8jI.pblXSj4DdgHyp.Gimt.bYLGA54Y94Hij0ZsHsPu5HPmRUEYBw.LpzSD
6wXVnE5N.9icJta0o8BZq12A6.C73dg9WThOyFK0yrKFaL0mAujTVDBISn56
eUYQpbq9lFNtPVT51YJdNlqJCXTkX8aooqr.Veh6QhMCT7Wgar70bEqtJUXA
BbLglZ7ufjilOX+jmqxQqMEXA.pyZ0U8ncUOZGxLTRi+RWPZAi.AoYpmU8ux
OeefthQAC9EWCFZKjPj84NHouogO2LasEAJ1jxuDpsZlLoF2f5NWBFb1YP5Z
ZH3YmAEzm4cfyJposo41toYFTCoqRFQlLuMR2D2HSJkQjtBbEgN2LH8MM7Ym
Ag5CCxTqYCoqNsQlr1OR2BrxBMFCKb6CVXLqP2ZoHeSFQ76SDwXVQPexrbVq
ni5UsoyZEcr10lL4pwvf9rlvwqB2eKJkVH91GxJVt+5jqAIu1395gkOAVWG+
82ffHmtDFcy5sUC8RCZ+ZRrlBoaPStCm9wEWTjyCoK6Vv3.aIf33OPW7d6tS
GN1+kFjQupHQx85GXazqJRydSQNeMikR0HtgppsB7aNt48ptcDe8gzSbvGno
jhXKr0hGCys.APaNI02VCHwafO6CNFMRyRWtjCucdQt5TdodMTQZ7qJRSnrA
OP+bZdRTOOfKtkmEgieB35.GnFtIL0LHqRmZ5KBUX.XfuHTcN5hPU77BGg2A
rHECe.cc2ibcoFTF.eWZY0enCJn3v0TUBHcrcLcuPpivbsGHOMFn5ao1Aqo9
0OzHcFZugvIgmsQRK3rYzD7lFYPv4xGczXfLBgQGr04L4fG.2CTPDVcmwzaj
WQhxR4UeK1ewVt+t+.BQG+eBkEJUzAX2+M39gaOfv21H4btFIr9yrMOG.Xh4
W0ux.ZYnONChpX2AGQWwXbvQy8fik6wGI21ONtGdTbkGC2lNBthkZbyOt4+w
LZKrO
-----------end_max5_patcher-----------
</code></pre>

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.gl.pix で簡易モーションブラー #max8 #jitter

おなじみバスケットボール

単に1フレーム前の画像と今の画像をブレンディングしてるだけです。

なぜかjit.gl.textureとzl regを通すと1フレーム前の映像がjit.gl.pixに戻るので簡易ブラーが実現できます。流れている線をみても特にtexture番号が変わっている訳でも無いのに不思議・・・内部処理に何か依存してるんでしょう。

ディレイは?

ディレイをしたい場合は、jit.gl.texturesetでやりましょう。

jit.gl.texturesetのhelp

jit.gl.pix で Gold Noise #max8 #jitter

リアルタイムグラフィックスの数学を1日1サンプルずつ進めているのですが、ノイズ生成の章でGenには無いビット演算を使っていて困りました。

別のアルゴリズムを探してみようと思い、出会ったのがGold Noiseです。少数の精度が低くても使えると書いてありました。名前がカッコイイ・・・

Gif

Blog容量の問題でフレームレート解像度は下がってますが、辺なパターンもなく良い感じでした

code


----------begin_max5_patcher----------
705.3ocwW10aZCCEF95vuBKeYGE4ORBI6evtaec2TUUJ3QCJwA43vXpp+2m+
HzMlnkyvQdHAV1wgW+jWe74jmlkfen6fnGidO5anjjmlkj3FxNPxX+Dba0gU
MU8togkhez8vV7b+kzhCZ2verRU0h5Eh0Hdd1wKKGZ6FzMBs6doiiVu1cKl+
la4uLU+7z+bmvuZvXzciWZWkd0i0xM2qDqz9qxWxVPliXjbaS4RWGyPubOFk
qkGElXG64Yyr+LOLNuAQIlOvAL85.jxRsLkwntFxaCHc5.b2GfyF+JYqvwFa
oiJZYDMOxBJb7XggWYgsgyil0cCXzXEWGZ4NjxR8VV4hr2hL1zQ1W9zm+JCN
cKCJlKsf6ah19xuqpLqAv3kGj4U5LONKZaK0UR3rkEBaoK8dVVzXqQH2neDN
doAgmGrTZzv6V3jwCgLdAIxmnrWrBQPvyiynW4YJYtJT3o9iVtPgJr+KICHA
YczkQ15dGXxnkWooQ7LkmFYz7UQuoqYsPppz0c1BVxoEDNblyCZi5XE0zbRz
x94gVI56ZFLHKQYTl8KXjSCCYpu5ZZZdzP1rNQuRgnjyvG9RAg4YtLC73k3y
aZC2qqaEvqnNnW1azmJ3QyljcpVvvETI0irw+G1B5lAtoV92u+tSD63mBbe2
fZ0wkzw28F8agVK500R6gNx+XR1iPQTzcm8gJXkRAnj8cRBVIao+WToiKmfT
xdN6kYhdxj5TqEpWeOJXHoPjlOEFGCJjAqDGhwwhkw411eFiiFlwU.4wY9D.
IKCZDWvJA4w4TDvw.cHR1TnDj8hrIgIBzH4f20WBQIxDDIW.UnSQxmNqZ2t8
BU+3rcZXxTusyE7UL20sV56xccUh80GmuKqLtRYxwpMIXGTt0E9PtuBJbamI
LVNTOFIanyHoqJ.YUqneWkGD71Z8hMBId1yy9EPHVci9
-----------end_max5_patcher-----------

jit.gl.pixのコードなので注意

余談

記事を書き終わって、そういえば・・・大昔に自分でjit.gl.pixで使うnoise調べてましたわ。今回とアルゴリズム違うのでこちらもご参照