メインコンテンツまでスキップ

title: Shader / Pipeline / Group クリップ

Shader / Pipeline / Group クリップ

OpenMotion では、シェーダーを用いた描画を 3 つの異なるクリップタイプとして定義しています。これらはコンテナ要素(scenegroup 等)の children 配列内で同等に扱われます。


思想:フル機能の解放

Shader 関連のクリップでは以下の自由を保証します:

  • マルチパスレンダリング: pipeline タイプによる複雑なポストプロセスの構築。
  • バッファアクセス: 他のクリップからのテクスチャ(tDiffuse)の受け取りや、過去フレームへのアクセス。
  • 透明な仕様: GLSL の Uniform をそのままプロパティとして公開。

プロジェクト内での構造

type によって動作モードが決定されます。

{
"name": "main-scene",
"type": "scene",
"start": 0,
"duration": 300,
"blendMode": "src-over",
"properties": {
"adjustments": [],
"position": [0, 0],
"scale": [1.0, 1.0],
"rotation": 0,
"opacity": 1.0,
"fps": 0.0,
"adjustments": [],
"children": [
{
"name": "single-shader",
"type": "shader",
"properties": {
"enabled": true,
"position": [0, 0],
"scale": [1.0, 1.0],
"rotation": 0,
"opacity": 1.0,
"blendMode": "src-over",
"fragmentShader": "...",
"uniforms": [ ... ]
}
},
{
"name": "post-process-pipeline",
"type": "pipeline",
"properties": {
"enabled": true,
"controls": [
{ "name": "BlurAmount", "type": "float", "value": 10.0, "min": 0, "max": 50 }
],
"children": [
{
"name": "blur-shader",
"type": "shader",
"properties": {
"enabled": true,
"fragmentShader": "...",
"uniforms": [
{
"name": "u_blur",
"value": { "type": "expression", "formula": "parent.BlurAmount" }
}
]
}
}
]
}
},
{
"name": "my-rigged-group",
"type": "group",
"properties": {
"enabled": true,
"controls": [
{ "name": "MainColor", "type": "color_vec3", "value": [1, 0, 0] }
],
"children": [
{
"name": "child-shader",
"type": "shader",
"properties": {
"enabled": true,
"fragmentShader": "...",
"uniforms": [
{
"name": "u_color",
"value": { "type": "expression", "formula": "parent.MainColor" }
}
]
}
}
]
}
}
]
}
}

クリップタイプと動作モード

OpenMotion のシェーダー描画は、用途に応じて 3 つのタイプに分かれます。

タイプ (type)役割children の性質tDiffuse (入力)
shader単一描画なし常に透明 (利用不可)
pipeline直列合成パイプラインの一工程直前の工程の結果
group並列素材独立した素材 (個別 blendMode)常に透明

使い分けの指針

  1. shader: シンプルな背景生成や、単一のポストプロセス。
  2. pipeline: 「元絵 → ブラー → 色補正」のように、一つの結果を作るための多段処理(全体で「一つの巨大なシェーダー」として機能)。
  3. group: パーティクルや装飾要素など、それぞれが異なる合成モードを持つ独立したパーツの集合。

コンテキストによるプロパティの挙動

shader クリップは、配置される場所(コンテキスト)によって、一部の共通プロパティが無視される場合があります。これにより、素材としてのシェーダーとポストプロセスとしてのシェーダーを同じ type: "shader" とし使い回すことが可能です。

プロパティtimeline / group 直下pipeline 内部
enabled有効 (表示/非表示)有効 (この工程をスキップ)
position / scale / rotation有効 (空間的な配置)無視 (常にフルスクリーン実行)
blendMode有効 (レイヤー合成)無視 (直前のバッファを上書き)
uniforms有効有効

Controls (リグ用カスタムプロパティ)

pipelinegroup といったコンテナ要素は、controls プロパティ(Property Object の配列)を持つことができます。

ここに定義された値は、子要素の各種プロパティ(uniformstransform 等)から、エクスプレッションの parent.Name 記法を用いて参照できます。これにより、内部の複雑なシェーダー群を、スライダー一つで制御する「リグ」の構築が可能です。


レンダリング詳細 (Technical Specs)

バーテックスシェーダーと頂点属性

OpenMotion の shader クリップは、常にフルスクリーン・クアッド(画面全体を覆う2つの三角形)に描画されます。そのため、Vertex Shader はシステムにより固定されており、ユーザーは Fragment Shader の記述に専念できます。

  • vUv (varying): 画面の UV 座標が渡されます。
  • 座標系: GLSL 標準の ボトムレフト (0, 0) を原点とします。

エラーハンドリング

シェーダープログラムのコンパイルに失敗した場合、そのクリップ(または pipeline 内の特定の工程)はエンジン側で自動的に enabled: false 扱いとなります。これにより、実行時のクラッシュを防ぎ、エラーのない直前の状態でレンダリングが継続されます。


Uniforms (Property Object)

uniformsProperty Object の配列 です。多次元型(vec2, color_vec3 等)やテクスチャ型を定義できます。

"uniforms": [
{
"name": "u_overlay",
"type": "texture",
"value": "asset-id-123"
},
{
"name": "u_threshold",
"type": "float",
"value": 0.5,
"min": 0,
"max": 1
}
]

シェーダーインターフェース(予約済み Uniform)

GLSL 内で常に参照可能なシステム予約済みの Uniform です。

名前説明
tDiffusesampler2Dpipeline 内部: 直前の工程の結果。
その他: 利用不可(透明)。
u_timefloatクリップ内の相対経過時間(秒)。
u_resolutionvec2クリップの描画解像度。
u_framefloat現在のフレーム番号。