外部コードとノードライブラリ#
外部コードの取り込みとCNLからの呼び出しを実装しています。ビルド・GPU検証の結果と、対応していない実行方式は別途追跡します。現在の対応範囲は下表を参照してください。
ファイルの役割#
Workspaceの主ファイルは一つの .cnl です。再利用する関数は .cnlf(.cnlF も可)へ分け、export した関数を import で使います。ライブラリやシェーダーを読み込んでも、Workspaceは増えません。
Fileの Import Source Module… でCNL、GLSL、HLSL、Slangのファイルを選ぶと、同じフォルダー内の依存ソースと一緒にWorkspaceへ取り込みます。取り込んだ内容はプロジェクトに保存します。元ファイルを変更しても、自動で別の処理へ置き換わりません。
// main.cnl
import * as gain from "./nodes/gain.cnlf";
function main(source: Image<Color,2>): Image<Color,2> {
return gain.apply(source, 1.5);
}
// nodes/gain.cnlf
export function apply(source: Image<Color,2>, amount: Float): Image<Color,2>
= glsl("./gain.glsl", "gain_pixel");
CNLで入出力を決める方式#
CNLで型と引数を定義し、GLSLには画像処理の関数を書きます。
vec4 gain_pixel(CnlPixel p, sampler2D source, CnlImageFrame frame, float amount) {
vec4 color = cnl_sample(source, frame, p.uv);
return vec4(color.rgb * amount, color.a);
}
画像引数には、大きさ・切り出し位置・サンプリング間隔を持つ CnlImageFrame が続きます。p.uv は出力画像の相対座標、p.position は元の解像度でのピクセル中心です。AEのコンポ座標とは区別します。異なるレイヤーで同じWorkspaceを使っても、それぞれの画像情報を使います。
HLSL・Slangは hlsl(...)・slang(...) として参照します。関数は float4、Texture2D<float4> など、その言語の型で書きます。CompNodeAEが受け渡しコードを内部で生成します。
既存のCompute Shaderを使う方式#
既存シェーダーのファイルを直接 import すると、コンパイラーの情報から画像・数値の入出力とデータ配置を読み取ります。元のコードは変更しません。
import * as effect from "./nodes/existing.comp";
adapt effect.main {
rename settings.gain as amount;
label settings.gain = "Amount";
default settings.gain = 1.0;
}
自動の受け渡しコードはCodeに書き出されません。adapt で明示した項目だけが、自動で読み取った名前や既定値より優先されます。元の処理と型・配置が合わなくなる変更はエラーになります。名前から時刻や解像度の意味を推測して、値を勝手に補うことはしません。
入力補完には .cnlf の公開関数、参照パス、読み取った引数名・型を使います。ノードの追加メニューのLibrariesから呼び出しを選べます。入力情報はOutputへつなぐ前から表示します。
現在の対応範囲#
| 対象 | 初期の対応範囲 |
|---|---|
| GLSL / HLSL / Slang | Vulkan Compute、2D RGBA32f画像、単純な数値・Boolean入力 |
| CNLで定義する画像関数 | Image入力、数値・ベクトル・Color入力、一つのImage出力 |
| 配列・行列・SSBOなど | 元の宣言と配置を保持。一部はCNLの型付き呼び出しに未対応で理由を表示 |
| GPU間の受け渡し | 外部処理の境界で転送が発生。転送をなくす最適化は未完了 |
| ライブラリ編集 | 保存されたソースの参照と補完。複数ファイルの編集・再読み込み画面は今後の対応 |
どんな既存シェーダーでも無条件に動く仕様ではありません。必要な画像形式や機能に対応できない場合は、元の宣言を保持して理由を表示します。
OpenFXを使う#
Import OpenFX Plugin… でコンパイル済みOpenFXファイルを選びます。プラグイン自身が宣言する画像入力・パラメータ・既定値をCNLへ対応させます。Choiceは選択肢を持つEnum、チェックはBoolean、文字はStringです。
初期の対応範囲はFloat RGBA・ストレートAlpha・正方形ピクセルの全画面CPU処理です。半分などのプレビュー解像度も元の解像度と区別します。時刻は cnl_time、フレームレートは cnl_frame_rate で指定します。
タイル、別時刻のフレーム要求、Alpha専用クリップ、独自GPU機能などは現在の接続方式では利用できません。メニューは一つのエフェクトを含むバイナリを対象にします。各PCで明示的に登録した同じ内容のプラグインを使い、OpenFXの実行ファイルはAEPへ埋め込みません。
OpenFX公式仕様、レンダリング仕様も参照してください。