Maxでシェーダーを何倍も扱いやすくなった。

#はじめに
この記事ではタイトルの通り、Maxでシェーダーを扱うのが何倍も簡単になったので、紹介します。
これは、MaxのOpenGLのバージョンアップが可能になったことで実現しています。
これによって、glsl(.jxsファイル)を自分で記述するのがより簡単になり、[ShaderToy](https://www.shadertoy.com)のソースコードをコピペだけで動かせるようにもなりました。
Maxの可能性の広がりに共感して頂けたら幸いです。


##実行環境
Max (Version8.0.8)
(*Maxのバージョンが 8.0.8以上である必要があります。*)


#今までのやり方
とても簡単になった方法を紹介する前に、これまでのShaderToyのソースコードの実行に必要だった手順をざっくり紹介します。
参考程度で、読み飛ばして頂いて結構です。

Max7までは、"jit.gl.slab"オブジェクトをダブルクリックしてもまっさらな状態の.jxsファイルが生成されるだけでしたので、一からシェーダーを記述していく必要があり、至難の技でした。

しかし、Max8になってからは"jit.gl.slab"オブジェクトをダブルクリックすると、

```glsl

<jittershader name="default">
	<description> Default Slab </description>
	<param name="scale" type="float" default="1.0" />
	<param name="tex0" type="int" default="0" />
	<language name="glsl" version="1.0">
		<bind param="scale" program="fp" />
		<bind param="tex0" program="fp" />		
		<program name="vp" type="vertex">
<![CDATA[
varying vec2 texcoord;
void main (void)
{
    gl_Position = ftransform();
    texcoord    = vec2(gl_TextureMatrix[0] * gl_MultiTexCoord0);
}
]]>		
		</program>
		<program name="fp" type="fragment">
<![CDATA[
varying vec2 texcoord;
uniform sampler2DRect tex0;
uniform float scale;

void main(void) 
{
	gl_FragColor = texture2DRect(tex0, texcoord) * scale;
}
]]>
		</program>
	</language>
</jittershader>

```

という状態まで書いてくれているのがデフォルトになりました。
これでも十分嬉しいのですが、見ての通りglslのバージョンは1.0となっています。

この状態からShaderToyのコードをコピペするには、デフォルト内のフラグメントシェーダーを記述している部分を置き換えて、変数の定義をし直す必要がありました。
また、定義した引数等は当然自分で用意する必要があります。

これ以上は、説明するとそれだけで一つの記事としてまとめる必要があるので、今回は割愛させて頂きます。
より具体的な変更の方法は、[こちらの動画](https://www.youtube.com/watch?v=WpcsiuqrjwQ)を参考にしてください。(リクエスト頂ければ、記事を書きます。)

#jitterのOpenGLのアップデート
と、こんな感じでいろいろと面倒だったこともあり、今までjitterでシェーダーを使う人はあまり多くありませんでした。
しかし、OpenGLのアップデートが可能になったことで、より便利にシェーダーを扱えるようになりました。
以下、アップデートの方法の紹介です。(とっても簡単です。)

+ まず、Maxを開きます。
+ Maxパッチの左側にあるメニューバーの一番上にある立方体マーク"Package Manager"をクリック
+ 右上の検索窓に"gl3"と記入し、"gl3"パッケージを検索
+ 選択したら、"gl3"パッケージのページに移動するので、"Install"ボタンをクリック
+ インストールしたら、"Launch"ボタンをクリック
+ "GL3-launch"パッチが開くが、まだ使えないので、開いたままにしておく
+ Max Preferencesを開き、"Jitter"項目のOpenGL Engineを"gl2"から"gl3"へ変更
+ 一度Maxを終了し、立ち上げなおす。

以上です。
最後の立ち上げ直した後、開きっぱなしだった"GL3-launch"パッチが再度開くと、Maxコンソールに

```
gl3 engine loaded
```

というメッセージが表示されていたらインストール完了です。
これで、OpenGLのバージョンアップは完了したのですが、このパッチに記載されているように"jit.mo"もインストールしないと、実行できないExapmlesもあります。
再度"Package Manager"を開いて、"fit.mo"を検索してインストールしましょう。
こちらは設定を変更するものではないので、Max再起動の必要はありません。

以上になります。
(オブジェクトによっては、gl3非対応のものもあります。その場合は再度gl2へ変更しましょう。)

#遊んでみよう

さて、いよいよ準備が整いました。
"GL3-launch"パッチ内のExamplesを遊んでみましょう!!

ShaderToy Loaderというパッチを開くと、ShaderToyのソースコードをコピペするだけで実行できる準備がされています。
これは感動...!

また、新規パッチで"jit.gl.slab"オブジェクトをダブルクリックすると、

```glsl
<jittershader name="default">
	<description>Default Slab </description>
	<param name="scale" type="float" default="1.0" />
	<param name="tex0" type="int" default="0" />
	<param name="modelViewProjectionMatrix" type="mat4" state="MODELVIEW_PROJECTION_MATRIX" />
	<param name="textureMatrix0" type="mat4" state="TEXTURE0_MATRIX" />
	<param name="position" type="vec3" state="POSITION" />
	<param name="texcoord" type="vec2" state="TEXCOORD" />
	<language name="glsl" version="1.5">
		<bind param="scale" program="fp" />
		<bind param="tex0" program="fp" />
		<bind param="modelViewProjectionMatrix" program="vp" />
		<bind param="textureMatrix0" program="vp" />
		<bind param="position" program="vp" />
		<bind param="texcoord" program="vp" />
		<program name="vp" type="vertex"  >
		<![CDATA[
			#version 330 core
			
			in vec3 position;
			in vec2 texcoord;
			out jit_PerVertex {
				vec2 texcoord;
			} jit_out;
			uniform mat4 modelViewProjectionMatrix;
			uniform mat4 textureMatrix0;
			
			void main(void) {
				gl_Position = modelViewProjectionMatrix*vec4(position, 1.);
				jit_out.texcoord = vec2(textureMatrix0*vec4(texcoord, 0., 1.));
			}
		]]>
		</program>
		
		<program name="fp" type="fragment"  >
		<![CDATA[
			#version 330 core
			
			in jit_PerVertex {
				vec2 texcoord;
			} jit_in;
			layout (location = 0) out vec4 outColor;
			
			uniform sampler2DRect tex0;
			uniform float scale;
			void main(void) {
				outColor = texture(tex0, jit_in.texcoord) * scale;
			}
		]]>
		</program>
	</language>
</jittershader>

```

と、さらに進化したデフォルトの.jxsファイルが見れます。
glslのバージョンも変わっていますね。

---
*追記*
"jit.gl.shader"というオブジェクトの方が、glslでのシェーダー記述に向いているかもしれません。
デフォルトの.jxsファイルは以下になります。

```glsl
<jittershader name="fill-flat-quads">
	<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" />
	<language name="glsl" version="1.5">
		<bind param="position" program="vp" />
		<bind param="modelViewProjectionMatrix" program="vp" />
		<bind param="color" program="vp" />
		<program name="vp" type="vertex">
<![CDATA[
    #version 330 core
    uniform mat4 modelViewProjectionMatrix;
    in vec3 position;
    in vec4 color;

    out jit_PerVertex {
        flat vec4 color;	
    } jit_out;

    void main() {	
        gl_Position = modelViewProjectionMatrix * vec4(position, 1.);	
        jit_out.color = color;
    }
    ]]>
            </program>
            <program name="gp" vertices_out="4" input_type="lines_adjacency" output_type="triangle_strip" type="geometry">
    <![CDATA[
    #version 330 core

    layout (lines_adjacency) in;
    layout (triangle_strip, max_vertices=4) out;

    in jit_PerVertex {
        flat vec4 color;	
    } jit_in[];

    out jit_PerVertex {
        flat vec4 color;	
    };

    void main() {
        gl_Position = gl_in[0].gl_Position;
        color = jit_in[0].color;
        EmitVertex();
        
        gl_Position = gl_in[1].gl_Position;
        color = jit_in[1].color;
        EmitVertex();
        
        gl_Position = gl_in[3].gl_Position;
        color = jit_in[3].color;	
        EmitVertex();
        
        gl_Position = gl_in[2].gl_Position;
        color = jit_in[2].color;	
        EmitVertex();
        
        EndPrimitive();
}
]]>
		</program>
		<program name="fp" type="fragment">
<![CDATA[
    #version 330 core

    in jit_PerVertex {
        flat vec4 color;
    } jit_in;

    out vec4 color;

    void main() {
        color = jit_in.color;
    }	
]]>
		</program>
	</language>
</jittershader>
```

.jxsファイルへのglsl記述については、別の機会に紹介させて頂きます!

----

各変数名などは、Examplesを遊んで見てみてください。


#最後に
今回は、より強くなったMax(Jitter)のOpenGLアップデートの紹介でした！
いかがだったでしょうか。
Maxユーザーの方々で、映像表現やglslをやってみようと思っていた方々にとっては朗報なのでは、と思います。
シェーダーによる表現はとても魅力的なので、今後のさらなるアップデートに期待しながら面白い使い方を模索したいと思います!!

ビジュアル表現でもMaxを使う人が少しでも増えてくれれば、幸いです。