カスタムレンダーパスでの描画について
このページにはベータ版に関する記述が含まれます。
Cubsim 5 SDK for Unity R5 beta 3 ではUniversal Render Pipeline(以下、URP)に対応したことに伴い、全てのCubismモデルの描画処理がカスタムレンダーパス上で行われるようになります。
カスタムレンダーパスの概要
Cubism SDK for Unity のカスタムレンダーパスは、Cubism URP Render Pass の名称で RenderGraph に登録されます。
RenderPassEvent は RenderPassEvent.BeforeRenderingTransparents に設定されており、透過オブジェクトの描画前に処理が行われます。
public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData)
{
const string renderCustomPass = "Cubism URP Render Pass";
~~~~~~
}
public override void Create()
{
_mScriptablePass = new CubismRenderPass
{
// Configures where the render pass should be injected.
renderPassEvent = RenderPassEvent.BeforeRenderingTransparents
};
}
RenderPassEvent はプロジェクトごとに利用しやすいものを設定してください。
カスタムレンダーパスで行っている処理と負荷について
カスタムレンダーパスではモデルの描画を行うための処理がまとまっています。
カスタムレンダーパスで確保する主なリソース
Cubism 5 SDK for Unity R5 beta 3 から新たに利用される、特にパフォーマンスに影響のあるリソースは下記のとおりです。
- モデルが描画されるテクスチャ
- 高度なブレンドモード使用時に一時的な描画先として使われるテクスチャ
- マスクを描画するテクスチャ
これらはテクスチャハンドルとして確保され、Cubismモデルを描画するカメラのレンダーターゲットの情報を元にテクスチャが生成されます。
処理の流れ
カスタムレンダーパスでの各フレームの描画処理は下記の流れで進行します。
- 描画に必要なリソース確保やデータの取得
- 描画順の計算
- 各モデルの描画
- 描画結果をカメラのレンダーターゲットへ反映
1. 描画に必要なリソース確保やデータの取得
描画に必要なリソースとして下記のテクスチャの使用を宣言します。
- アクティブなカラーテクスチャ
- アクティブな深度テクスチャ
- モデルが描画されるテクスチャ
- 高度なブレンドモード使用時に一時的な描画先として使われるテクスチャ
- マスクを描画するテクスチャ
描画処理に必要な次のデータを CubismRenderPass.PassData として保存します。
- 描画に利用される全てのモデルの CubismRenderController
- Grouped Sorting IndexとGrouped Sorting Indexごとにまとめられた CubismRenderController の配列
- URPから渡されるカメラのデータ
- URPから渡されるリソースデータ
- マスクを描画するテクスチャのハンドル
- アクティブなカラーテクスチャのハンドル
- アクティブな深度テクスチャのハンドル
- モデルが描画されるテクスチャのハンドル
- 高度なブレンドモード使用時に一時的な描画先として使われるテクスチャのハンドル
2. 描画順の計算
描画順ソート用のインデックスや、SortByDepth利用時にカメラからの距離が前のフレームと異なる場合などに描画順を更新します。
更新された場合、最後に描画処理が行われるDrawableがどれかについても確認し、フラグを設定しています。
3. 各モデルの描画
最初に、モデルが描画されるテクスチャへ描画ターゲットを切り替えます。
その後、モデルの各描画オブジェクトの描画処理の前に、各描画オブジェクトが描画処理を行うかを確認する処理を行います。
どのオブジェクトを描画するかが確定したら、描画順に従って必要な描画処理を呼び出します。
また、描画オブジェクトの描画処理呼び出し前後に描画割り込み機能での処理呼び出しを行っています。
詳しくは「描画割り込み機能」をご確認ください。
4. 描画結果をカメラのレンダーターゲットへ反映
デフォルトの設定ではGrouped Sorting Index(以下、グループ)ごとにカメラのレンダーターゲットへ反映します。
Grouped Sorting Indexの機能については「Grouped Sorting Index について」をご確認ください。
Grouped Sorting Index(以下、グループ)毎にカメラのレンダーターゲットへ反映する機能は、同グループ以外の描画オブジェクト(モデル)に対してブレンドモードを影響させないために行われています。
この設定を無効化した場合、同一のグループであるかに関わらず描画済みの描画オブジェクト(モデル)にブレンドモードの影響が出る代わりに、グループの数が多い場合のパフォーマンスが向上します。
詳しくは「負荷について」をご確認ください。
なお、設定に関わらず、同一のグループ内に描画される描画オブジェクトには別モデルの描画オブジェクトかどうかに関わらずブレンドモードが影響します。
Grouped Sorting Index について
モデルをグループごとに分けて描画処理を行うCubism SDK for Unity 独自の機能です。各モデルは CubismRenderController.GroupedSortingIndex ごとに描画順を制御します。
CubismRenderController.GroupedSortingIndex が異なるモデル同士は CubismRenderController.SortingOrder や座標を変更しても描画順が前後しません。
Cubism 5 SDK for Unity R4_1 以前では CubismRenderController.SortingOrder や座標のみで描画順を制御しており、特にSortingByOrderの時にモデル同士を交差させないために CubismRenderController.SortingOrder の値を大きく離れた値にする必要がありました。
これはモデル全体の描画順である CubismRenderController.SortingOrder がモデルの各DrawableのSortingOrderである CubismRenderer.SortingOrder に加算する形で描画順が変更されていたためです。
Cubism 5 SDK for Unity R5 beta 3 ではGrouped Sorting Indexによって、 CubismRenderController.SortingOrder と独立してモデル同士の前後関係を設定することが出来るようになりました。
負荷について
カスタムレンダーパスでパフォーマンスに影響のある項目は下記の通りです。
Grouped Sorting Index
デフォルトの設定(有効)では、カメラのレンダーターゲットへ描画結果を反映するため、Grouped Sorting Index毎にDrawMeshが実行されます。
この影響でGrouped Sorting Indexのユニークな数だけドローコールが増加します。
この設定を切り替えるにはフラグ CubismRenderControllerGroup.IsCopiedToCameraTexture を操作します。
デフォルト値は true です。
この設定を無効化した場合、Grouped Sorting Index毎のDrawMeshによる反映がスキップされ、全てのモデルの描画が完了した後にカメラのレンダーターゲットへ1回だけ反映されます。
描画済みの描画オブジェクトに対してブレンドモードの影響が出る代わりに、設定が有効な場合と比べて描画されるGrouped Sorting Indexのユニークな数が多いほどパフォーマンスが向上します。
シーンビュー
Unity Editor上では、シーンビューの描画特性の都合により追加で処理を行っている箇所があります。
そのため、Unity Editor上ではやや描画負荷が高まります。