7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-09-20

#はじめに
この記事ではタイトルの通り、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を使う人が少しでも増えてくれれば、幸いです。

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?