「Image-Line Forum > IndexPlugin & Preset > ForumsZGameEditor Visualizer forum」の「Shadertoy uniform variable equivlents」の翻訳。
訳者コメント:
ShaderToyはWebGL向けのFragmentShaderを、Webページ上で「記述」、「デバッグ」、「シェア」できるWebサイトで、その道(?)では有名どころのひとつです。
「WebGL向けのFragmentShader」というのは「GLSL」という言語で書かれるんですが、ZGameEditorでも使われている言語なので、ShaderToyで書かれたShaderを「ZGameEditorに持ってきて使う」ことは「(わかってれば)それほどむずかしくはない」ようになっています。
実際のところFL Studio付属のシェーダの中には「ShaderToyで開発、シェアされていたものをImage-Lineの中の人がシェーダを書いた個々人と交渉して許諾を得て使っている」ものが結構な数あります(参考「ZGameEditorVisualizerのエフェクト」ページにある程度まとまっています)。
この資料は「持ってきて使う」ための「ヒント」となるものです。中には動かすのがすごい大変なものもあるかと思います。
ShaderToyは開発環境としても優秀と思うので、「ShaderToyで自分で書いたシェーダを持ってくる」というのもありだと思います。ほかの人が書いたものを使う場合は許諾を得た方が良いような気がしていますが、ShaderToyのサイトのポリシーとかに関わる話で、まだ調べてないのでよくわかりません。
以下は、「ShaderToy向けに書かれたシェーダーで使われている変数にZGameEditorの変数を当てはめるパターン」の例です。
| ShaderToyの変数 | 意味 | 対応付けられるZGameEditorの変数と、割り当て手順の例 |
| vec3 iResolution | viewportの解像度(pixel) | ZgameEditorの「App.ViewportWidth, App.ViewportHeight」の各変数を、「Shader variableコンポーネント」の「ValuePropRef」プロパティに設定するとよいでしょう。Shader内では「uniform float」として記述してiResolutionをリプレースするなどすればよいでしょう。 訳注: Shaderコンポーネント内にiResX, iRexYとかいったのShader variableコンポーネントを作ってそれぞれのValuePropRefにApp.ViewportWidth, App.ViewportHeightを設定、Shader側は uniform float iResX; uniform float iResY; した上で vec2 iResolution=vec2(iResX, iResY); ……みたいなことをすればいいような気がします。 |
| float iGlobalTime | shader起動からの時間(秒) | ZGameEditorの「App.Time」を「Shader variableコンポーネント」の「ValuePropRef」に設定すればよいでしょう。 Shader側では、「uniform float」型で受け取って「iGlobalTime」変数を置き換えるなりするとよいでしょう。 注意:ShaderToyの「iGlobalTime」は速度が固定ですが、ZGameEditorでは速度が一定しません。アニメーションで使った場合、ジャンプ(フレーム落ち)のような形で問題となる可能性があります。必要に応じて someVar+=App.deltaTime*speed; //とか重み付けして、ソース中のiGlobalTimeをsomeVarで置き換える 等といったコードで対応するとよいでしょう。 |
| vec4 iMouse | マウスカーソル位置(pixe coord) xy: MLB down時の値 zw: クリック | マウスカーソル位置を拾う変数です。当然ですが、レンダリング時やレンダリング後にはマウスカーソルを拾うことはできません。iMouse変数は実質上そのままでは使えないので、必要に応じて適宜スライダー等「時間変化させることができるもの」に置き換えるとよいでしょう。 |
| float iChannelTime[4] | 各チャンネルの起動からの経過時間(秒) | 非サポート?私が移植を行ったエフェクトでは、App.Time(上記のiGlobalTime)を使っています。FL Studioの 「SongPositionInBeats」変数を使うのがいいかも知れません。 |
| sampler2D or samplerCube iChannel{i} | ||
| textures | 入力チャンネル:画像 | これに相当するデータは、ZGameEditorでは、Shaderコード中でで"uniform sampler2D tex1;"として利用できます。「Shader variableコンポーネント」を定義する必要もありません。他のチャンネル(ZGameEditorで定義されているMaterial texture)についても「tex1,tex2,tex3...」として利用できます。 |
| video | 入力チャンネル:ビデオ | ZGameEditorで「VideoTextureBitmap」という名前の「Bitmapコンポーネント」を定義し、「Materialコンポーネント」内で利用する形にします。FL12付属の「VideoWall」エフェクトは参考になるでしょう。あとはtextureと同じように扱えます。 |
| audio | 入力チャンネル:音声 | FL Studioの「AudioArray」、または「SpecBandArray」変数がsampler2D型の「shader variableコンポーネント」として利用できます。ちょっとしたトリックで実装されているので、必要があればフォーラムで質問してください。音声データは、y==0として「float型の一次元配列」として扱われます。vec2 someVar.xy=floatValue;といった形で、vec2型でステレオデータを取得するのも可能です。(訳注:とか訳してみたものの、あんまり意味がわかっていません) |
| iSampleRate | use AudioArray.SizeDim1 in a shader variable component to define or replace all instances of iSampleRate. | |
【ZgeViz用エフェクト開発の手引き】