----------------------------------------------------------------

	ＭＧＳ２用ＬＩＢＤＧアウトライン説明

	2001.02.17	K.Takabe
	$Id: mgs2_libdg_1.txt,v 1.1.1.3 2002/11/19 11:41:43 Yoshizawa1 Exp $

----------------------------------------------------------------


●ＬＩＢＤＧについて
　ＬＩＢＤＧはグラフィック周りの制御をするためのライブラリであり、
　画面の表示を行うオブジェクトを管理する。



●ＬＩＢＤＧの実装について
　ＬＩＢＤＧ自体は他のアクターと同様にＬＩＢＧＶの特殊なアクターを登録することで
　駆動するように作られている。ＬＩＢＤＧ自体は２つのアクターを生成する
　・ＤＧデーモン１・・・ＧＶのアクターリストの中で一番最初に実行される
　　　　　　　　　　　　権限で生成される。このアクターデーでは、ＶＳＹＮＣ待ち、
　　　　　　　　　　　　表示画面切り替え、ＤＭＡスタートを行う。
　・ＤＧデーモン２・・・ＧＶのアクターリストの中で一番最後に実行されるように
　　　　　　　　　　　　生成される。このアクターでは次のフレームで描画を開始する
　　　　　　　　　　　　ＤＭＡパケットの生成などを行う。実質的にＤＧのメインになる部分。
　ＬＩＢＤＧには２つのデーモンアクターを生成し、フレームの最初に行う処理を
　デーモン１として登録し、それ以外の描画に関するセットアップや処理を、フレームの一番最後に
　デーモン２として登録する。（そのフレーム内のパラメータ変更などが次の描画に反映されるように
　するため）



●チャンネルの概念について
　ＬＩＢＤＧには現在５つのチャンネルが存在する。チャンネルとはレンダリング描画面のことで、
　それぞれのチャンネルに対してカメラ、描画領域などが指定され、番号の若い順から描画
　されていく。（描画順は一部例外有り）
　・チャンネル０・・・通常の描画用。メインチャンネル。
　・チャンネル１・・・子画面、エフェクト用チャンネル。
　・チャンネル２・・・無線のキャラクタウィンドウ用チャンネル。
　・チャンネル３・・・無線のキャラクタウィンドウ用チャンネル。
　・チャンネル４・・・２Ｄ専用チャンネル。描画フェーズも２Ｄ関連のみしか用意されていない。
　各チャンネル毎に各オブジェクトの描画フェーズというものが設定されており、一般的な
　３Ｄ用チャンネルでは

　　１）描画環境設定ステージ
　　２）プラグイン処理ステージ０ <DG_DMAPACK>
　　３）可視チェック＆マトリクスセットアップフェーズ（描画には直接は関係ない） <DG_OBJS>
　　４）マルチテクスチャオブジェクトのＤＭＡパケット生成ステージ <DG_OBJS>
　　５）マルチウェイトエンベロープオブジェクト処理ステージ <DG_EVMOBJ>
　　６）不透明シングルテクスチャオブジェクトのＤＭＡパケット生成ステージ <DG_OBJS>
　　７）後回し描画指定のマルチテクスチャオブジェクトのＤＭＡパケット生成ステージ <DG_OBJS>
　　８）後回し描画指定のマルチウェイトエンベロープオブジェクト処理ステージ <DG_EVMOBJ>
　　９）影投影処理ステージ <DG_OBJS>
　１０）スポットライト投影処理ステージ <DG_OBJS>
　１１）プラグイン処理ステージ１ <DG_COMDL,DG_DMAPACK,DG_PATCH,光学迷彩DG_OBJS>
　１２）プリミティブオブジェクト処理ステージ（描画には直接は関係ない） <DG_PRIM2>
　１３）半透明オブジェクト＆プリミティブオブジェクトのＤＭＡパケット生成ステージ <DG_OBJS&DG_PRIM2>
　１４）プラグイン処理ステージ２ <DG_DMAPACK>
　１５）プラグイン処理ステージ３ <DG_DMAPACK>

　といった構成になっている。
　DG_COMDLやDG_DMAPACK、光学迷彩、DG_PATCHなどはプラグインとしてプラグイン処理ステージ１で
　実行されるようになっている。

　また、各チャンネルには表示領域をビットフラグで管理するためのグループＩＤをいうものが
　設定でき、大半のオブジェクトは各チャンネルに設定されたグループＩＤと同一のビットが
　たっていないと表示されないようになっているので、各部屋の表示非表示などをこれを
　使って管理することができる。

　また、各オブジェクトはそれぞれのチャンネルに対して任意に表示非表示を設定することも出来る。



●ＬＩＢＤＧの描画について
　ＰＳ２において描画用パケットを生成しながら描画をしても無駄が多く発生してパフォーマンスが
　発揮できないため、ＬＩＢＤＧにおいてはフレーム処理の一番最後に次のフレームにて描画すべき
　描画パケットを全て生成し、次のフレームではＤＭＡをスタートさせてから描画と並列でＣＰＵ側の
　処理を行うようになっている。これによって１フレーム分のＤＭＡパケットを保持する必要がでてくるが、
　その分描画に関しては性能限界まで使い切ることが出来るようになっている。
　１フレーム分の描画パケットの記録には２ＭＢのバッファをダブルバッファで確保している。



●ＤＭＡの管理方法
　描画に使用するＤＭＡは各描画フェーズでの処理を切り分けて考えることが出来るように、各ＤＭＡの
　実行要求をＤＭＡタスクとみなし単独で実行できるように構築し、描画の際にはＤＭＡ終了割り込みで
　チェインしていくことで全ての描画を行う機構になっている。また、ＧＳからのデータ転送
　（ストアイメージ）もＤＭＡ制御部分で管理しており、その都度転送モードの設定なども行う。
　ＤＭＡタスクとして分けるメリットとして描画がフェーズごとに切り離されて実行されるため、
　ＤＭＡデータ不具合によるバグなどの解析が行いやすくなっている。　
　注意点としてＤＭＡの終了が描画の終了ではないため、ＧＳの描画終了チェックなどもきちんと行っている。



●表示用オブジェクトの種類について
　ＬＩＢＤＧの扱う表示オブジェクトには代表的なものとして以下ものがある
　・ＫＭＳモデル表示オブジェクト（DG_OBJSオブジェクト）
　・ＥＶＭモデル表示オブジェクト（DG_EVMOBJオブジェクト）
　・プログラム生成プリミティブ表示オブジェクト（DG_PRIM2オブジェクト）
　・共有モデル表示オブジェクト（DG_COMDLオブジェクト）
　・ＰＳ２ＤＭＡパケットオブジェクト（DG_DMAPACKオブジェクト）



●ＬＩＢＤＧの扱うモデルについて
　ＬＩＢＤＧの扱うモデルにはＫＭＳと呼ばれるものと、ＥＶＭと呼ばれるものの
　２種類のフォーマットが存在する。さらにＫＭＳモデルにはテクスチャが１枚
　しか貼り付けられないシングルテクスチャモデルと最大３枚までテクスチャが
　貼り付けられるマルチテクスチャモデルの２種類があり、シングルテクスチャ
　モデルはプログラム初期化時にリアルタイムシェードかプリシェードかを選べる。


　＜ＥＶＭモデルについて＞
　　ＥＶＭモデルはマルチエンベロープモデル（１頂点あたりに複数のマトリクスを与えることで
　　単一メッシュのモデルを関節モデルのように変形させることの出来るモデル）を定義した
　　フォーマットであり、描画には大きな負荷がかかる代わりに微妙な変形が行えるため
　　主に表情アニメーションが必要なハイクオリティキャラモデルなどに使用される。

	・主な特徴
　　　最大３枚までのマルチテクスチャ（環境マッピング＆バンプマッピング対応）
　　　１頂点あたり最大４マトリクスまで
　　　光源計算は１モデルに対し平行光源×３＋アンビエントのみ


　＜ＫＭＳモデル（マルチテクスチャ）について＞
	マルチテクスチャＫＭＳモデルはキャラクタの質感を出すためにマルチテクスチャに
　　対応したＫＭＳモデル。他のモデルにない特徴として頂点カラーモジュレートがある。
　　これは光源計算により決定した頂点カラーをさらに頂点カラーで乗算して最終的な
　　頂点カラーを求めるもので、プログラム側でリアルタイムに色合いを変更したい場合に
　　使用することができる。
	一応データ的にはシングルテクスチャＫＭＳと互換性があるため、プログラム側で
　　細工することでシングルテクスチャＫＭＳと振舞うことも可能。

	・主な特徴
　　　最大３枚までのマルチテクスチャ（環境マッピング対応）
　　　制限突きで１頂点あたり最大２マトリクスまで
　　　光源計算は１モデルに対し平行光源×３＋アンビエントのみ
　　　頂点カラーモジュレート対応
　　　影生成対応


　＜ＫＭＳモデル（シングルテクスチャ）について＞
	シングルテクスチャＫＭＳモデルはＬＩＢＤＧにおいて一番基本的なモデルデータであり、
　　ゲーム中で使われるモデルの大半はこの形式である。
　　半透明属性のオブジェクトはプリミティブ描画フェーズにおいてオブジェクト単位でソートされた
　　ものが描画される。

	・主な特徴
　　　ポリゴンには１枚しかテクスチャを貼り付けられない
　　　半透明オブジェクトに対応（制限付き）
　　　制限突きで１頂点あたり最大２マトリクスまで
　　　光源計算は１モデルに対し平行光源×３＋アンビエントのみ、もしくは頂点単位のプリシェーディング
　　　影生成対応
　　　影投影対応



　＜モデルタイプの種類一覧＞
　　　　　　　　ファイル　　内部データ形式　　　　　シェーディング方法
　　-------------------------------------------------------------------
　　モデル－＋－ＥＶＭ－＋－マルチテクスチャ－－＋－リアルタイムシェード（Ａ）
　　　　　　｜
　　　　　　＋－ＫＭＳ－＋－マルチテクスチャ－－＋－リアルタイムシェード（Ｂ）
　　　　　　　　　　　　｜
　　　　　　　　　　　　＋－シングルテクスチャ－＋－リアルタイムシェード（Ｃ）
　　　　　　　　　　　　　　　　　　　　　　　　｜
　　　　　　　　　　　　　　　　　　　　　　　　＋－プリシェード　　　　（Ｄ）

　　○・・・対応
　　△・・・制限付きで対応もしくは対応していても推奨しない
　　×・・・非対応
　　　　　　　　　　　　　　　　　　　　　　　　　　｜Ａ｜Ｂ｜Ｃ｜Ｄ｜カテゴリ
	－－－－－－－－－－－－－－－－－－－－－－－－＋－＋－＋－＋－＋－－－－－－
　　クリッピングを考慮しない高速レンダリング　　　　｜×｜×｜○｜○｜描画制御
　　クリッピングによるシザリング　　　　　　　　　　｜○｜○｜○｜○｜描画制御
　　ポリゴンのバッククリップ　　　　　　　　　　　　｜○｜○｜×｜○｜描画制御
　　４マトリクスエンベロープ　　　　　　　　　　　　｜○｜×｜×｜×｜エンベロープ
　　制限付き２マトリクスエンベロープ　　　　　　　　｜×｜○｜○｜×｜エンベロープ
	リアルタイムシェーディング（Ｐ×３＋Ａ）　　　　｜○｜○｜○｜×｜光源処理
	プリシェーディング（無制限頂点光源演算）　　　　｜×｜×｜×｜○｜光源処理
　　オーバーレイによるマルチテクスチャ効果　　　　　｜×｜×｜×｜○｜テクスチャ
	マルチテクスチャ　　　　　　　　　　　　　　　　｜○｜○｜×｜×｜テクスチャ
　　マルチテクスチャ環境マッピング　　　　　　　　　｜○｜○｜×｜×｜テクスャチ
　　マルチテクスチャバンプマッピング　　　　　　　　｜○｜×｜×｜×｜テクスチャ
　　頂点アニメーション　　　　　　　　　　　　　　　｜×｜○｜○｜○｜特殊効果
　　影生成　　　　　　　　　　　　　　　　　　　　　｜×｜○｜○｜△｜特殊効果
　　影投影　　　　　　　　　　　　　　　　　　　　　｜×｜△｜○｜×｜特殊効果
　　赤外線ゴーグル反応エフェクト　　　　　　　　　　｜○｜○｜○｜×｜特殊効果
　　光学迷彩エフェクト　　　　　　　　　　　　　　　｜×｜○｜○｜×｜特殊効果
　　描画フェーズ後回しによる優先制御　　　　　　　　｜○｜○｜×｜×｜特殊効果



●DG_PRIM2オブジェクトについて
　DG_PRIM2オブジェクトはエフェクトなどのようにプログラム側で頂点、ＵＶ、頂点カラーを
　設定することで任意のプリミティブを表示することができるオブジェクト。

　一つのオブジェクトは複数の頂点で定義された「パケット」という単位で管理され、
　このパケットを複数持たせることが出来る。パケット数には制限がないが、パケットに
　含ませる長点数はプリミティブタイプにより固有の制限があるため注意が必要

　DG_PRIM2オブジェクトは描画時にパケット単位でソートが行われる。

　DG_PRIM2オブジェクトに設定できるテクスチャは１つのみであり、さらにそのテクスチャは
　半透明属性指定がされたものでなければならない。もし、複数のテクスチャを切り替えて
　アニメーションをする必要がある場合には１つのテクスチャにアニメーションテクスチャを
　並べてたものを用意し、ＵＶ値をアニメーションさせることで実現させる。

　モデルデータと異なりDG_PRIM2オブジェクトで使用する頂点やＵＶ値などのデータは
　オブジェクトごとにメインワーク上に確保されるため、極端なプリミティブ確保は
　メモリ不足の原因になりやすいので注意が必要。

　＜扱えるオブジェクトの種類＞
　　・三角形ストリップ（１パケットに付き最大６４頂点）
　　・バッククリップ付き三角形ストリップ（１パケットに付き最大６４頂点）
　　・ラインストリップ（１パケットに付き最大６４頂点）
　　・任意サイズスプライト（１パケットに付き最大３２頂点）
　　・回転正方形スプライト１パケットに付き最大１６頂点
　　但しストリッププリミティブはフラグ制御により各プリミティブの表示、非表示を
　　コントロールできる。



●テクスチャについて
　ＬＩＢＤＧで使用されるテクスチャはステージデータ構築時に指定したＴＲＩファイルに
　パックされたものを使用する。このＴＲＩファイル内にパックできるテクスチャの最大は
　１ＭＢまで（ＶＲＡＭのテクスチャ領域の最大が１ＭＢの為）。
　また、ステージ構築時に半透明属性指定されたＴＲＩはDG_PRIM2オブジェクト及び
　半透明ＫＭＳオブジェクトの描画に用いられ、そのステージに含まれる全ての半透明
　ＴＲＩデータの合計が１ＭＢ以内でなければならない。
　パックされるテクスチャは１６色もしくは２５６色で書かれたパレット付きの画像データ
　のみ扱うことが出来る。

　実際には個々のテクスチャはＶＲＡＭを効率よく使用するために一旦大きなテクスチャ内に
　敷き詰められる（＝ＣＭ２ファイル）ため、プログラム中でＵＶ値を指定する場合には
　ＵＶ値の補正が必要になる。（たとえばあるテクスチャはまとめられたテクスチャ内の
　(U:0.25,V:0.50)～(U:0.50,V:1.00)の領域にマッピングされているといった具合）

　また、半透明用のＴＲＩを除き、基本的にＴＲＩは描画順の単位として扱われ、
　ＴＲＩデータをＶＲＡＭに送ったあとにそのＴＲＩを使用するオブジェクトが連続して
　描画される。ただし、ＴＲＩによって描画順が制御されるのは同一タイプオブジェクトのみ
　である。
　たとえばＥＶＭとＫＭＳでは描画フェーズそのものが独立しているため、同一ＴＲＩを
　使用していても描画はそれぞれ別々に処理される。このため違うオブジェクトタイプ同士て
　ＴＲＩを共有していると各描画フェーズごとに再度ＶＲＡＭへのテクスチャ転送が行われて
　しまい、描画のロスになることが予想されるため、今のバージョンでは同一フレームで
　２度テクスチャ転送が発生した場合にはそのオブジェクトを点滅させる処理を入れてある。



●モデルの半透明問題
　ＭＧＳ２ではモデルは基本的に半透明で描画されることになっている。透明か不透明かは
　テクスチャのアルファ値によって決まる。このとき、半透明モデル及びプリミティブの
　ソート付き表示されるものに対しては無条件にＺバッファ更新を行わないように描画を
　しているが、その他の描画フェーズにおいてはアルファ値が５０％を境に、Ｚバッファの
　更新、非更新を制御するようになっている。
　不透明モデルにおいてもアルファ値を持ったテクスチャのポリゴンにおいては半透明描画
　されるが、アルファ値の５０％が濃い場合にはそれ以上遠景に描画することが出来なくなり、
　逆に５０％より薄いと遠景のものが上書きされることになる。１つのテクスチャでアルファ値が
　０～１００％で変化するようなものは描画順を考慮しないとアルファが５０％のところで模様が
　浮き出てしまうので注意しなければならない。



●共有モデルオブジェクトについて
　薬きょうのような少ポリゴンのモデルを数多く出す場合に、通常のモデルと同じような描画を
　行うとモデルデータの転送などのロスが大きく響いてしまい効率が悪いため、モデルをＶＵ１に
　のるサイズに制限することでマトリクスの入れ替えだけで少ポリゴンモデルを軽負荷で無数に
　出せるようにした特殊なオブジェクト。
　欠点は負荷を極限まで軽くするため、ポリゴンのクリッピングやシェーディング計算も
　省くようになっていることであるが、これによりかなりの数出すことが可能。



●ＰＳ２ＤＭＡパケットオブジェクトについて
　ＭＧＳ２システムでは抽象的な描画用オブジェクトのみを管理し、実際の描画に使用するＰＳ２形式の
　パケットはシステム内で生成され見えないようになっているが、場合によってはＰＳ２形式パケットを
　システム外からも使いたい場合があったり、機能を拡張したり出来るようにＰＳ２形式パケットを
　ＤＭＡに接続するための特殊なオブジェクトを用意した。但し、これは機種依存性が極めて高く、
　多用することで移植性が犠牲になるので注意が必要。



●パッチ曲面について
　パッチ曲面オブジェクトは４点の頂点座標と変化方向成分を与えることで４角形のパッチを描画できる
　特殊なオブジェクト。ＭＧＳ２では海面などに使用されており、パッチ曲面に設定されたパラメータを
　元にシステム側でＬＯＤなどを自動的に行うようになっている。また、分割レベルの違うパッチ曲面
　同士が並んでいる場合にエッジの不接合を補正する機能があるためつなぎ目のない海面を実現することが
　できる。



●影、スポットライトについて
　ＭＧＳ２システムではシャドウマップによる影とスポットライトに対応している。但し影とスポットライトは
　処理の関係で併用は出来ないようになっている。影とスポットライトは共に光源位置を定義するための
　スポットライトオブジェクト（DG_SPOT）と影を生成するためのフラグをつけたDG_OBJSオブジェクト、それに
　投影される影を画面にレンダリングするための投影オブジェクトと呼ばれるDG_OBJSオブジェクトが
　必要になる。
　影は１つの影生成キャラに対して１つのスポットライトを用意し、そのスポットライトから見える影を
　黒で描画して影テクスチャを作成し、それをアルファブレンドで描画することで実現している。
　スポットライトはまずテクスチャとして円を描画し、その上にそのスポットライトから見える影生成キャラを
　黒で描画することでテクスチャを生成し、このテクスチャを加算半透明として描画することでスポットライトを
　実現している。
　この実現方法の違いで、影のほうは複数人のキャラが重なると色が濃くなるが、スポットライトではそれが
　起きないという特徴がある。



●頂点アニメについて
　ＫＭＳモデルに関してはスケルトンによる細かい変形などをサポートしていない代わりに
　頂点データを直接アニメーションさせる機能をサポートしています。ただし、
　そのままだとストリップ化されたデータを扱わなければならず、処理スピードや
　プログラムにも無駄が発生するため、共有頂点情報データ（ＣＶ２ファイル）を
　用いることでアニメーションをオペレーションを共有頂点の状態で行えるように
　補助関数が用意されています。
　ＣＶ２を使うためにはステージデータ構築時にＣＶ２データを取り込むように
　する必要があります。（メモリの無駄な消費を抑えるために必要のないＣＶ２は
　取り込まないように注意しましょう）



●光源処理について
　ＬＩＢＤＧではステージ固有光源（平行光源×１＋アンビエント）と局所光源データ
　、一時光源を管理している。

　局所光源データとは光源位置を保持する点光源、線光源、スポット光源、減衰点光源
　で構成された光源データであり、ステージ中に複数配置することができる。ただし、
　実際に全ての局所光源が反映されるのはシングルテクスチャＫＭＳのプリシェード
　オブジェクトのみであり、他のモデルデータでは代表点における光源の影響の内
　一番強い光源２つを平行光源近似したものとステージ固有光源をあわせたライトマトリクス
　によってシェーディングされる。

　一時光源とはプログラム側で点光源及びスポット光源を１フレームだけ発生させる
　光源のことで、発生した一時光源は局所光源と同じ扱いでライトマトリクスに
　反省させることが出来る。また、自動再計算フラグの設定されているプリシェードモデルに
　対しても反映させることが出来るようになっている。



●ＬＩＢＤＧの機能を関節的に使用する方法について
　ＬＩＢＤＧの提供する機能のうちいくつかのものは他のライブラリを使用することで
　簡単に使用することが出来ます。

　＜モデルデータ＞
　　GM系（OBJECT関連）ライブラリを使用する。
　　また、GM系ライブラリを使用することでモーション再生やCONTROLとの
　　連携が可能なため、一般的にはこっちを使う場合の方が多い。

　＜カメラ制御＞
　　GM系（GM_Camera関連）ライブラリを使用する。
　　カメラはＬＩＢＤＧで管理されているが、ＭＧＳでは多くのカメラを同時に管理したりする
　　必要がありるため、ゲーム中のカメラは全てGM_Camera関連を通して設定する必要がある。

　＜頂点アニメ、他＞
　　LIBUTL系ライブラリを使用する。
　　頂点アニメに関してはvertex_animation.cなどを使用する。
　　また、頂点アニメ以外にもLIBUTL内にはＬＩＢＤＧ関連の補助となるようなものがあるので
　　一度目を通しておくといいかも。


