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

外部リンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です