Shader(.hlsl)ファイルを読み込む

AIと読む
全ドキュメントを1ファイルで(llms-full.txt)

これから自作エフェクトを作るなら、Fx Editor(.srfx) を使ってください。 ブラウザでGLSLを書いて .srfx を書き出すと、Windows・Mac の両方で動くエフェクトノードになります。 このページで説明する .hlsl 直置きは、それより前からある別の仕組みです。

.hlsl ファイルは映像素材のひとつとして扱われます。ノードではなく、動画や画像と同じように MediaBrowser に並び、レイヤーに置いて再生します。

2つの仕組みの違い

.hlsl(このページ).srfxFx Editor
何になるかレイヤーで再生する素材エフェクトノード(映像を受けて加工する)
書く言語HLSLGLSL(Shadertoy方言)
動くOSWindowsのみWindows / Mac
置き場所Source/ShaderCustomFx
パラメータ増やせないuniform を書くとノードのポートになる

.hlsl はWindows版でのみ動きます。 実行中にHLSLをコンパイルする仕組みがWindows専用のため、macOS版では .hlsl 素材は再生できません。

置き場所

<Source Directory>/SainaWorks/SynapseRack/Source/Shader/<任意のフォルダ名>/○○.hlsl

Windowsの既定では C:/SainaWorks/SynapseRack/Source/Shader/ です。 親フォルダの位置は VJ素材を読み込むパス(Source Directory)を指定する で変えられます。

フォルダを1つ挟んでください。 Source/Shader/○○.hlsl のように直下に置いたファイルは対象外です。 Source/Shader/MyShaders/○○.hlsl のように、必ずフォルダの中に入れます。 挟んだフォルダの中はさらに入れ子にしても構いません。

新しい .hlsl を取り込む手段は、現行バージョンには用意されていません。 かつてメニューにあった一括読み込み(Source → Load Source Files)は無くなっており、 MediaBrowser へのドラッグ&ドロップも .hlsl については取り込めません。 以前のバージョンで取り込み済みの .hlsl は、そのまま MediaBrowser に残って再生できます。 新しく書くなら .srfx を使ってください。

書き方

ファイルの中身はフラグメントシェーダーの関数1つです。全体を囲むシェーダー宣言は書きません。

cbuffer Params : register(b0)
{
    float2 resolution;   // 描画先の幅・高さ(ピクセル)
    float  time;         // アプリ起動からの経過秒
    float  globalBPM;    // Global Tempo のBPM
    float  param0;
    float  param1;
    float  param2;
    float  param3;
};

float4 Frag(VsOutput input) : SV_TARGET
{
    float2 uv = input.uv;
    float  v  = sin(uv.x * 20.0 + time * 3.0) * 0.5 + 0.5;
    return float4(v, uv.y, 1.0 - v, 1.0);
}

決まりごと

項目内容
関数名Frag、戻り値 float4、セマンティクス SV_TARGET
引数の型VsOutput(自分で定義しません。posSV_POSITION)と uvTEXCOORD0)を持ちます)
UVinput.uv が 0〜1
定数バッファregister(b0) に上表の並びで渡ってきます。順番を変えると値がずれます
#includeStreamingAssets フォルダを基準に展開されます

param0param3 は予約枠です。 現行のUIには、この4つを操作する場所がありません。並びを合わせるために宣言はしておいてください。

入力テクスチャはありません。 .hlsl 素材は「自分で絵を作る」側です。映像を受け取って加工したい場合は Fx Editor(.srfx) のエフェクトノードを使ってください。

コンパイルに失敗したとき

画面がマゼンタ(ピンク)の単色になります。真っ黒ではなくマゼンタなら、シェーダーの文法エラーです。

使う

MediaBrowser に、動画や画像と同じサムネイル付きのクリップとして並びます。 レイヤーへドラッグするか、レイヤーを選んでクリックすれば再生が始まります。

resolution にはそのレイヤーの解像度が入るので、出力解像度を変えるとシェーダー側の描画サイズも追従します。 globalBPMGlobal Tempo の値がそのまま入るので、拍に同期した動きを書けます。

関連

このページへのリンク

同じページを参照しているページ