jit.gl.shader / GLSL でマルチテクスチャ #maxmsp #jitter #glsl
マルチテクスチャ
jit.gl.shaderの中で複数のテクスチャを利用する方法を調べました。Tutorial 43: A Slab of Your Very Own こちらで紹介されている方法です。jit.gl.slabで使うことを想定して紹介されていますが、jit.gl.shaderでも利用できるように少しコードを変更しています。
JXS / GLSLコード
<jittershader name="mrr.mixer.4ch.jxs">
<description>
</description>
<param name="a" type="vec4" default="0.25 0.25 0.25 0.25"/>
<param name="b" type="vec4" default="0.25 0.25 0.25 0.25"/>
<param name="c" type="vec4" default="0.25 0.25 0.25 0.25"/>
<param name="d" type="vec4" default="0.25 0.25 0.25 0.25"/>
<!-- 4つのテクスチャを使う場合にはparam要素の指定と、default値の指定が必須 -->
<param name="tex0" type="int" default="0" />
<param name="tex1" type="int" default="1" />
<param name="tex2" type="int" default="2" />
<param name="tex3" type="int" default="3" />
<language name="glsl" version="1.2">
<bind param="a" program="fp" />
<bind param="b" program="fp" />
<bind param="c" program="fp" />
<bind param="d" program="fp" />
<bind param="tex0" program="fp" />
<bind param="tex1" program="fp" />
<bind param="tex2" program="fp" />
<bind param="tex3" program="fp" />
<program name="vp" type="vertex">
<!-- GLSL内部で日本語コメントすると即落ちする -->
<!-- varying 次のシェーダーへ受け渡す / 前のシェーダから受け取る変数 -->
<!-- uniform Maxから直接受け取れる変数。param指定 -->
<![CDATA[
#version 120
varying vec2 texcoord0;
varying vec2 texcoord1;
varying vec2 texcoord2;
varying vec2 texcoord3;
void main(void)
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
texcoord0 = vec2(gl_TextureMatrix[0] * gl_MultiTexCoord0);
texcoord1 = vec2(gl_TextureMatrix[1] * gl_MultiTexCoord1);
texcoord2 = vec2(gl_TextureMatrix[2] * gl_MultiTexCoord2);
texcoord3 = vec2(gl_TextureMatrix[3] * gl_MultiTexCoord3);
}
]]>
</program>
<program name="fp" type="fragment">
<![CDATA[
#version 120
uniform vec4 a;
uniform vec4 b;
uniform vec4 c;
uniform vec4 d;
varying vec2 texcoord0;
varying vec2 texcoord1;
varying vec2 texcoord2;
varying vec2 texcoord3;
uniform sampler2DRect tex0;
uniform sampler2DRect tex1;
uniform sampler2DRect tex2;
uniform sampler2DRect tex3;
void main()
{
vec4 input0 = texture2DRect(tex0,texcoord0);
vec4 input1 = texture2DRect(tex1,texcoord1);
vec4 input2 = texture2DRect(tex2,texcoord2);
vec4 input3 = texture2DRect(tex3,texcoord3);
gl_FragColor = a * input0 + b*input1 + c*input2 + d*input3;
}
]]>
</program>
</language>
</jittershader>
jit.gl.pixと比較
上記のサンプルであれば、jit.gl.pixで出力した結果をjit.gl.*系のオブジェクトへバインドすれば同様の事ができるのでjit.gl.pixで書いた方が良いと思われます。Vertex ShaderやGeometry ShaderでのVertexの操作やテクスチャの細かいバインディングする場合に必要になる処理ですね。
Recent entries
- jit.gl.gridshape の matrixoutput についてのメモ #max8
- jit.gl.pix で簡易モーションブラー #max8 #jitter
- jit.gl.pix で Gold Noise #max8 #jitter
- Gen で配列をつくる検討 #Max8
- Package Managerで配布されているease objectを使いやすくしてイージング #max8
- Node for Max を用いて、定形外のUDPデータを受信 #Max8 #n4m
- 平ハウス物語 – 山田尚子監督作品 非公式ファンイベント
- The Splendid Expression – GITADORA×NOSTALGIA
- ghost in my place【from DEEMO II】
- EP “Boys O’Clock”
- 7th Album “多次元宇宙論”
- LEON.jpのWEB特集「大人のいい時間」にAromが紹介されました。
- 音できらめくキャンドルライト Arom(第2世代)発売開始
- EP “Strange Story”
- 都市の呼吸【from Cytus II】




