04. 他のシステムとの連携について
(※青は 2013/10/03の主な追記事項)
Live2Dを他社のシステム(ゲームエンジン等)と連携させる上で、最初に確認しておくべきポイントについて記載します。
Unity、cocos2d-x についてはSDKが対応しておりますので、ここではそれ以外の環境との連携についてまとめております。
また、Live2Dをプラットフォーム毎の標準的なプログラム環境で利用する場合もこのページの情報は必要有りません。
以下の操作、描画を他のシステムの間に含めることが可能であれば、連携が実現できる可能性は高くなります。
Live2Dの初期化と開放
Live2D::init( )によりLive2Dを初期化します。
Live2D::dispose()により使用しているメモリを開放し、ライブラリをアンロードできる状態にします。
(通常のゲームではライブラリを途中でアンロードする必要は発生しません)
メモリ管理
Live2Dで使用するメモリ(CPU、GPU)の確保を行うためのアロケータを外部で定義していただき、Live2D初期化時(Live2D::init())に登録します。Live2Dのメモリマネージャから必要に応じて4K以上のブロックでのメモリの要求が発生します。
モデル・テクスチャのロードと初期化
Live2Dは描画のみの機能を提供するため、Live2D内でリソースの管理は行わず、外部のコードまたはゲームエンジン側でリソース管理を行う前提で設計されております。
モデル等の独自のデータは、Live2Dの外でファイルをロードして頂き、バイト列をLive2Dのライブラリに渡して初期化。
テクスチャは、Live2Dの外でテクスチャとして初期化してから、Live2Dに登録
アクション・モーションの開始等
クリックなどのイベント等に応じてLive2D用のアニメーション、表情変化等の命令を呼び出します。
Live2D内の処理はスレッドセーフになっていないため、同時に複数のスレッドからモデルデータの更新、描画等が行われないようにする必要があります。
フレーム毎のモデルの更新と描画
フレーム毎に上記で初期化頂いた各モデルに対して以下の命令を行います。
モデルの各パラメータをセット、アニメーションデータの開始・停止など
モデルの update()処理(主にCPU演算)
モデルの draw() 処理(主にポリゴン描画) 詳しくは後述
描画の詳細
通常の3Dで行われるデプスバッファを用いた描画と異なり、Live2Dでは平面のポリゴン(半透明部分を含むテクスチャ)を、背面から順番に重ねてブレンド描画して表現しております。(Photoshopのレイヤー表現を3D上で行うようなイメージです)
具体的な描画設定・内容は
デプステストは通常オフ(各ポリゴンを指定の分だけZ値を変えて描くこともできます。)
シェーダは基本的なテクスチャのアルファブレンド処理のみ
頂点配列、UV配列、インデックス配列によりテクスチャ付きポリゴンを描画
となります。
各種描画命令はOpenGL等、プラットフォームごとの3D命令の途中で Live2Dモデルのdraw()を呼び出すことで行います。
描画命令はLive2Dのライブラリの中で隠蔽されて呼び出されます。
描画部のソースコードは開示されておりませんが、特別な契約により描画部のコードを提供することも可能です。詳しくはサポートにお問い合わせ下さい。
・・・
描画時の対象が3Dと同じスクリーンに直接描画する場合と、Live2D用のオフスクリーンバッファに一度描画してからスクリーンに描画する場合で処理が多少異なります。
Live2Dのキャラクターを半透明の状態にしたい場合は、2のオフスクリーン方式を取る必要があります。
1.スクリーンにLive2Dを直接描画する場合
不透明の3Dポリゴンを描画した後に Live2D の描画命令を実行します。
Live2Dが、前後の3Dオブジェクトに挟まれた状態を作るのは通常のデプスバッファ方式では困難で、何らかのテクニックが必要になります。
2D的なゲームで、Live2Dのキャラクターを半透明表示する必要がない場合は通常この方式で問題ありません。
2.オフスクリーンにLive2Dを描画する方式
フレームバッファオブジェクト(FBO)等のオフスクリーンにLive2Dを描画してから、スクリーンに描画する場合は、以下のプロセスになります。
以下、FBOを例に説明します。
2-1 透明なFBOに、Live2Dを描画
2-2 FBOをスクリーンに描画(通常の透明有りテクスチャを描くのと同等)
FBOにLive2Dを描いた上で、FBOを半透明にしてスクリーンに描画することでLive2Dモデルを半透明にすることが出来ます。
(1のスクリーンに描画する方式で半透明にした場合は、各層が透けてしまい、例えば顔が透けて後ろ髪が見えるといった現象になってしまいます)
※オフスクリーン、テクスチャが premultiplied (事前にアルファ値がRGBにかけられた色値の保持形式)になっていない環境では、1.多少色が異なってしまう、2.キャラクターの周囲にわずかに色が乗ってしまうという癖があります。