#はじめに
この記事ではタイトルの通り、Maxでシェーダーを扱うのが何倍も簡単になったので、紹介します。
これは、MaxのOpenGLのバージョンアップが可能になったことで実現しています。
これによって、glsl(.jxsファイル)を自分で記述するのがより簡単になり、ShaderToyのソースコードをコピペだけで動かせるようにもなりました。
Maxの可能性の広がりに共感して頂けたら幸いです。
##実行環境
Max (Version8.0.8)
(Maxのバージョンが 8.0.8以上である必要があります。)
#今までのやり方
とても簡単になった方法を紹介する前に、これまでのShaderToyのソースコードの実行に必要だった手順をざっくり紹介します。
参考程度で、読み飛ばして頂いて結構です。
Max7までは、"jit.gl.slab"オブジェクトをダブルクリックしてもまっさらな状態の.jxsファイルが生成されるだけでしたので、一からシェーダーを記述していく必要があり、至難の技でした。
しかし、Max8になってからは"jit.gl.slab"オブジェクトをダブルクリックすると、
<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のコードをコピペするには、デフォルト内のフラグメントシェーダーを記述している部分を置き換えて、変数の定義をし直す必要がありました。
また、定義した引数等は当然自分で用意する必要があります。
これ以上は、説明するとそれだけで一つの記事としてまとめる必要があるので、今回は割愛させて頂きます。
より具体的な変更の方法は、こちらの動画を参考にしてください。(リクエスト頂ければ、記事を書きます。)
#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"オブジェクトをダブルクリックすると、
<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ファイルは以下になります。
<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を使う人が少しでも増えてくれれば、幸いです。