title: Shader / Pipeline / Group クリップ
Shader / Pipeline / Group クリップ
OpenMotion では、シェーダーを用いた描画を 3 つの異なるクリップタイプとして定義しています。これらはコンテナ要素(scene や group 等)の 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) | 常に透明 |
使い分けの指針
- shader: シンプルな背景生成や、単一のポストプロセス。
- pipeline: 「元絵 → ブラー → 色補正」のように、一つの結果を作るための多段処理(全体で「一つの巨大なシェーダー」として機能)。
- group: パーティクルや装飾要素など、それぞれが異なる合成モードを持つ独立したパーツの集合。
コンテキストによるプロパティの挙動
shader クリップは、配置される場所(コンテキスト)によって、一部の共通プロパティが無視される場合があります。これにより、素材としてのシェーダーとポストプロセスとしてのシェーダーを同じ type: "shader" とし使い回すことが可能です。
| プロパティ | timeline / group 直下 | pipeline 内部 |
|---|---|---|
enabled | 有効 (表示/非表示) | 有効 (この工程をスキップ) |
position / scale / rotation | 有効 (空間的な配置) | 無視 (常にフルスクリーン実行) |
blendMode | 有効 (レイヤー合成) | 無視 (直前のバッファを上書き) |
uniforms | 有効 | 有効 |
Controls (リグ用カスタムプロパティ)
pipeline や group といったコンテナ要素は、controls プロパティ(Property Object の配列)を持つことができます。
ここに定義された値は、子要素の各種プロパティ(uniforms や transform 等)から、エクスプレッションの parent.Name 記法を用いて参照できます。これにより、内部の複雑なシェーダー群を、スライダー一つで制御する「リグ」の構築が可能です。
レンダリング詳細 (Technical Specs)
バーテックスシェーダーと頂点属性
OpenMotion の shader クリップは、常にフルスクリーン・クアッド(画面全体を覆う2つの三角形)に描画されます。そのため、Vertex Shader はシステムにより固定されており、ユーザーは Fragment Shader の記述に専念できます。
vUv(varying): 画面の UV 座標が渡されます。- 座標系: GLSL 標準の ボトムレフト (0, 0) を原点とします。
エラーハンドリング
シェーダープログラムのコンパイルに失敗した場合、そのクリップ(または pipeline 内の特定の工程)はエンジン側で自動的に enabled: false 扱いとなります。これにより、実行時のクラッシュを防ぎ、エラーのない直前の状態でレンダリングが継続されます。
Uniforms (Property Object)
uniforms は Property 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 です。
| 名前 | 型 | 説明 |
|---|---|---|
tDiffuse | sampler2D | pipeline 内部: 直前の工程の結果。その他: 利用不可(透明)。 |
u_time | float | クリップ内の相対経過時間(秒)。 |
u_resolution | vec2 | クリップの描画解像度。 |
u_frame | float | 現在のフレーム番号。 |