レイヤー 〜 画像制御単位
概要
sketch/ExHIBITにおけるレイヤーは、主要な画像出力先で、便宜上、画面最奧にあるイベント画面と、 最前面にあるムービー画面と、その間にあるビルボードに分けられています。
これ以外に、ビューやイベント画面に関連づけられるクリッパーと呼ばれる一種の深度ステンシルバッファや、各画面に付随するバッファ類にもほぼレイヤーと同等の出力先として利用できるところに、ExHIBITの特徴があります。 付随バッファに関しては、各画面の解説でもう少し詳しく説明します。

ExHIBITの画面構成
イベント画面
イベント画面は、画面の最も奧に位置する 32bit color のレイヤーで、主にイベントCGを表示するところから、「イベント画面」と呼ばれています。 大きさは常にゲーム画面と同じ(800x600のゲームなら、800x600。1024x576のゲームなら1024x576)大きさになります。
全ての表示の基本となるレイヤーですが、一般的にレイヤーとしては取り扱われないので、ビルボード群の後ろにあるという意味で、 レイヤーIDが -1 となっています。 イベント画面を入出力の対象にできるコマンドは、レイヤーID指定に-1を指定することで、イベント画面そのものを対象にすることができます。
本質的にレイヤーなので、その属性にαチャンネルを所有させることが出来ますが、これより後ろにデータが存在しないため、αチャンネルによって透明扱いされる部分には書き換えが発生しなくなります。 大抵はバグにしか見えませんのでご注意下さい。透明度についても同様です。
イベント画面には、クリップ準備領域と、イベント拡張領域と、イベントクリッパーという3つの付随画面があります。
クリップ準備領域は、イベント画面に画像を表示する際「クリップ準備」をチェックすることで作られる画面で、画像と同じ大きさを持っています。拡大縮小を始めとする変形や各種エフェクトのソースになる領域です。
イベント拡張領域は、クリップ準備領域の上に作られる領域で、主にムービーの表示に利用されます。この領域に出力されたムービーは、イベント画面の変形に追従して変形します。
イベントクリッパーは、イベント画面に表示されている画像と同じ大きさをもったクリッパーで、クリッパーの形状がイベント画面の変形に追従する点が通常のクリッパーと異なります。(通常のクリッパーはビューに関連づけられています)
ムービー画面
ムービー画面は、OSのDirectShowが作成するウィンドウで、アニメ - MPG1 - の再生(音有/同期)だけが使用します。 単にムービーを再生するためだけの画面で、再生開始時に自動的に作られ、再生終了時に自動的に破棄されるため、開発者が任意に、その他の用途で利用することはできません。 OPやDEMOや特殊な演出専用ですね。 なお、便宜上MPG1というカテゴリに分類されていますが、実行環境でのWindowsMediaPlayerで再生可能なフォーマットならほぼ全てを取り扱うことが出来ます。
例えば、WMV や MP4 それに、divx などもコーデックがインストールされていればOKです。ただし、DRMが設定されているものなどは一部取り扱えないものもあります。 また、H264などのように、非常に重いフォーマットを利用する場合、相応のパワーが必要になります。
現在のwindows環境では、サポートのしやすさを考えると、いまだにMPEG1が一番確実な選択肢です。6MBPS〜8MBPSくらいのビットレートを利用すれば、品質もまあまあといえるでしょう。
もっとゲーム上の演出に密着したムービー再生を行う場合は、アニメ - MPG1 - の再生(音無/非同期)を使用します。 こちらは、イベント画面や任意のビルボード上にムービーを表示することができ、 アニメ - MPG1 - の操作(音無/非同期)を利用すれば、任意位置からの再生や、任意位置の停止、任意位置から任意位置のループなどが自由に表示可能です。
また、より詳細な取り扱いが可能な(しかし、データサイズは大きくなります)可逆圧縮のDLT形式も利用できます。
ビルボード(レイヤー)
ビルボードは、イベント画面とムービー画面の間にあるレイヤーで、画面演出の基本になります。 演出の説明が行われる場所で、何の注釈もなく「レイヤー」といえば、通常はこのビルボードを指します。
基本属性として、8ビットカラーのものとフルカラーのものの2種類が作成できますが、それぞれ出来ることに一部違いがあります。詳しくは後述のレイヤーの種類と機能を参照して下さい。
作成可能な枚数は、エディションやバージョンによってまちまちです。現在のレイヤーの利用状況については、後述のExHIBITの具体的なレイヤー構造を参照して下さい。
サイズは、1x1〜32bit整数 の範囲で自由に作れますが、windows9xとの互換性の観点から、一辺が32767ピクセルよりも大きなレイヤーは使用しないほうが良いでしょう。 また、高品位な変形を行う場合、一辺が8000ピクセルを越える元画像データを利用すると計算中に桁あふれを起こす場合があります。そういうことをするレイヤーは、一辺が8000ピクセル以下になるようにしてください。
Z-ORDERも0〜32bit整数の範囲で自由に設定できますが、煩雑さをさけるため、デフォルトでは、LayerID=Z-ORDERとなっています。そのためLayerIDの大きなものほど画面手前に配置されます。
ビルボードは、それぞれ独立したαチャンネルを所有できます。歴史的な事情でαチャンネルには17段階のものと256段階のものが利用できますが、新規に作成する場合は256段階を利用したほうが良いでしょう。 いずれの場合でも、αチャンネルは8ビットのグレースケール画像になります。
ビルボードは、自分自身のαチャンネルで切り取られた後、各種クリッパーで切り取られ、その後合成されます。
レイヤーへの描画
ここではαチャンネルの有無によるビルボード(以下レイヤーと呼びます)への画像の合成と、特殊な事例について解説します。
通常、システムは、イベント画面〜最上位のレイヤーまでを適宜合成して最終的な画面を作り出しています。 実際には画面更新の最適化のために複雑な処理が行われますが、簡略化して言うと、
  1. 画面と同じ大きさのバッファAを用意する
  2. イベント画面をAにコピーする
  3. 一番奥から手前に向かってレイヤーをAに合成する。レイヤーがαチャンネルを持っているなら、それを適用してAに合成する。
という処理を行って画面を作成しています。このようにレイヤーのαチャンネルは、そのレイヤーの画像を最終画面に合成するときに使われるものです。
さて、今レイヤーに対して画像を描画する場合、そのパターンは次の4つが考えられます。
  1. レイヤー(αチャンネル無し)+合成画像(αチャンネル無し)
  2. レイヤー(αチャンネル無し)+合成画像(αチャンネルあり)
  3. レイヤー(αチャンネルあり)+合成画像(αチャンネル無し)
  4. レイヤー(αチャンネルあり)+合成画像(αチャンネルあり)
このうち1〜3の、どちらか片方にαチャンネルがある場合と、両方にない場合は、単純に画像だけが転送されます。 また、4の両方にαチャンネルがある場合は、画像とαチャンネルがそれぞれ独立して転送されます
αチャンネル無しのレイヤーだけの場合
背景
layer
表示結果
1.レイヤーにも、合成画像にもαチャンネルがない場合
当然、画像だけが転送されます。
背景
layer
合成画像
表示結果
2.レイヤーにはαチャンネルがないけれど、合成画像にはある場合
合成画像のαチャンネルが無視され、画像だけが転送されます。
背景
layer
+
合成画像α
表示結果
αチャンネルありのレイヤーだけの場合
背景
+
layerα
表示結果
3.レイヤーにはαチャンネルがあるけれど、合成画像にはない場合
単に画像だけが転送されます。
レイヤーのαはそれとは無関係に画面が合成される際に適用されます。
背景
+
layerα
合成画像
表示結果
4.両方にαチャンネルがある場合
画像は画像に、αはαに、別々に転送されます。
合成画像のαを適用してレイヤーの画像に合成するわけではないことにご注意ください。
背景
+
layerα
+
合成画像α
表示結果
背景
+
layerα
+
合成画像α
表示結果
一部の選択アイテム合成には例外的な処理が用意されています。詳細は選択アイテムをご覧下さい。
レイヤーの種類と機能
レイヤーには、8ビット(256色)レイヤーと、フルカラーの32ビットレイヤーの2種類があります。 標準は8ビットレイヤーで、32ビットレイヤーの1/4のメモリ消費量ですみますが、色数が増えるタイプのエフェクトを利用できません。
  8bit 32bit 解説
α(17) - 17段階αチャンネルを持てるか
α(256) 256段階αチャンネルを持てるか
ランクマスク(17) - パレット番号がそのまま透明度になる。主に文字表示用。
ランクマスク(256) - パレット番号がそのまま透明度になる
加算合成 加算合成ができるか
clipper無視 クリッパーの適用から除外できるか
入力透過 入力時、自分自身がないように振る舞う
一時表示 しばらくしたら消えるよう設定できるか
透明度 透明度を指定できるか
位置 表示位置を指定できるか
ぼかし - ぼかしの出力先になれるか
スナップ - スナップショットの出力先になれるか
変形 - 拡大縮小ができるようにできるか
ExHIBITの具体的なレイヤー構造 (ver.1.42 以降)
LID(レイヤーID)が0〜86のものは、ExHIBIT ver.1.20以前で利用されていた実レイヤーID指定との互換性のために残されています。 現在ではレイヤーの構造が変わっても互換性が維持される仮想レイヤーID指定が使われます。
頻度は演出時に明示的に指定される場合が多いものをマークしました。マークされていないものは明示的に指定することはほとんどありません。
仮想LID 識別記号 頻度 解説
0
|
86
実レイヤー指定。ver.1.20以前との互換のため、現在でも利用でき、適切に対応するレイヤーにマッピングされます。拡張されないレイヤーは、現在でもこの範囲のLIDで利用されています。
-1 イベント画面
0 EVMASK イベント画面のみにかかるマスク
1-3     歴史的事情により未使用。使用はできます。
300
|
311
BACK キャラの後ろにある演出用レイヤー
292     BACKの終端。現在は311と同じになる
294     CHARA0の最初のレイヤーにマップされます
- CHARA0   立ちキャラ表示用(block0)現在5キャラ分
293     CHARA0の最後のレイヤーにマップされます
400
401
  CHARA0と1の間にある演出用レイヤー
296     CHARA1の最初のレイヤーにマップされます
- CHARA1   立ちキャラ表示用(block1)現在5キャラ分
295     CHARA1の最後のレイヤーにマップされます
500
501
  CHARA1と2の間にある演出用レイヤー
298     CHARA2の最初のレイヤーにマップされます
- CHARA2   立ちキャラ表示用(block2)現在5キャラ分
297     CHARA2の最後のレイヤーにマップされます
550
551
  CHARA2と3の間にある演出用レイヤー
290     CHARA3の最初のレイヤーにマップされます
- CHARA3   立ちキャラ表示用(block3)現在5キャラ分
289     CHARA3の最後のレイヤーにマップされます
1000番台 1000+キャラIDでそのキャラが登場していれば、立ちで利用されているLIDになります。これは、上記のCHARA0〜3までのどこかのレイヤーにマップされます
600
|
611
EFFECT キャラの手前にある演出用レイヤー
299     EFFECTの終端。現在は611と同じになる
650
|
669
SYSEFFECT   拡張用EFFECT。物理的にEFFECTと連続していることが保証されていますので、現在612は650にマッピングされますが、それに依存したコードはできるだけ避けて下さい。
291     SYSEFFECTの終端。現在は669と同じになる
700 MASK-M メッセージウィンドウより奧を全て隠すマスク用
750
|
753
    吹き出し履歴用
51     メッセージの背景用
52     メッセージ表示用
53     名前表示の背景用(名前専用領域使用時)
54     名前表示用(名前専用領域使用時)
55     メッセージ表示後のキー待ちアニメーション用
800
|
808
    メッセージウィンドウの上に表示される装飾領域。顔とか。
ver.2010.3.4以前は800-803。2010.3.5で拡張された。
809     装飾領域のマスク用。809は仮想IDだが、利用しない場合は、800〜809までガジェットに使える仮想ID配置になっている。
810
|
814
    標準選択肢が利用する
820
|
831
    コントロールボタン0〜11が配置されるレイヤーID
840
|
842
    コントロールボタンのプロパティメニュー用
850
|
855
    セーブロード/コンフィグ等のシステム用
860
861
    バックログ用
870
871
    ダイアログ用
890     インフォメーション表示用
900 MASK-A 全てを覆うマスク用
84 NOTIFY   特殊通知用
85     Retouchロゴ表示用
86     デバッグ情報出力用