Unity を検索

軽量レンダーパイプライン ― リアルタイムパフォーマンスの最適化

2018年2月21日 カテゴリ: テクノロジー | 7 分 で読めます
取り上げているトピック
シェア

Is this article helpful for you?

Thank you for your feedback!

最近のブログ記事で、スクリプタブルレンダーパイプライン(SRP)の概念をご紹介しました。SRP とは端的に言うと、Unity がフレームをどのようにレンダーするかをデベロッパーが C# で制御できるようにするものです。Unity 2018.1 では、軽量レンダーパイプライン(LW RP)および高画質レンダーパイプライン(HD RP)という 2 つのレンダーパイプラインがリリースされます。本記事ではこのうち、軽量レンダーパイプラインに焦点を絞って解説して行きます。

レンダーパイプラインを C# で制御可能にする目的は、Unity のブラックボックスを削減し、レンダリング中に実行される処理をデベロッパーが明示的に制御できるようにすることです。デベロッパーは Unity がビルトインで提供しているパイプラインを使用しても良いですし、あるいは、独自のパイプラインをゼロから作成したり、提供されているものを修正してそれぞれの目的に適ったパイプラインを作成することもできます。

スクリプタブルレンダーパイプラインの概念を端的に紹介した動画を公開しています。この中で、各種のパイプラインを使用したプロジェクトの映像もご覧いただけます。

このコンテンツはサードパーティのプロバイダーによってホストされており、Targeting Cookiesを使用することに同意しない限り動画の視聴が許可されません。これらのプロバイダーの動画の視聴を希望する場合は、Targeting Cookiesのクッキーの設定をオンにしてください。

軽量レンダーパイプラインの目的は、ライティングおよびシェーディングとのトレードオフを取ることにより、リアルタイム性を損なわないようパフォーマンスを最適化することにあります。

軽量レンダーパイプラインは、幅広いモバイルプラットフォーム向けの開発や、VR 向け開発、また限られたリアルタイムライティングで事足りるゲームの開発用に提供されています。このパイプラインが実行するのはシングルパスフォワードレンダリングで、オブジェクト毎にリアルタイムシャドウライト 1 つ、ライトカリング 1 回となっており、すべてのライトが 1 回のパスでシェーディングされるという利点があります。従来のパイプラインのフォワードレンダリング(範囲内のピクセルライト 1 つ毎に実行されるパスの数が 1 回多い)と比較すると、軽量レンダーパイプラインではドローコールの数が少なくなります。その代わり、パス毎のライトの数が少なくなることで、シェーダーの緻密性(複雑性)が低減します。また、軽量レンダーパイプラインはシェーダーグラフにも対応しています。シェーダーグラフツールはシェーダー記述ワークフローの利便性をさらに高めるものです。

軽量パイプライン対応のシェーダー

軽量レンダーパイプラインには独自のレンダリングのプロセスがあるため、それを踏まえて記述されたシェーダーが必要となります。マテリアルのシェーダー選択ドロップダウンメニューにある Lightweight Pipeline グループから、新しい標準シェーダーのセットにアクセスできます。これには、標準の物理ベースレンダリングシェーダー、簡易的なライティングモデルを持つ標準の非物理ベースレンダリングシェーダー、標準テレインシェーダー、標準 Unlit シェーダーが含まれます。Unity の旧 Unlit シェーダーはすべて、すでに軽量レンダーパイプラインと併用可能となっています。これには従来のパーティクルや UI、スカイボックス、スプライトシェーダーも含まれます。

また、軽量レンダーパイプラインはマテリアルのアップグレーダーも提供しています。これは Unity の旧 Lit シェーダーを軽量レンダーパイプラインと互換性のあるシェーダーにアップグレードするためのものです。マテリアルをアップグレードするには、メニューを Edit -> Render Pipeline -> Upgrade -> Lightweight の順に選択してください。プロジェクト内のすべてのマテリアルをアップグレードすることも可能ですし、選択したマテリアルのみをアップグレードすることもできます。

マテリアルのアップグレーダー

レンダーパイプラインアセット

レンダーパイプラインを選択するには、Graphics Settings ウィンドウの Scriptable Render Pipeline Settings 内でパイプラインアセットをアサインしてください。または、スクリプトから GraphicsSettings.renderPipelineAsset プロパティでアサインすることも可能です。

1 つのパイプラインを選択してプロジェクトのレンダリングのアプローチ全体を最初から定義する以外に、同じタイプのレンダーパイプラインの異なるインスタンス内に複数の画質設定を保存することも可能です。パイプラインアセットはレンダリング画質のグローバル設定を制御し、パイプラインインスタンスの作成も行います。パイプラインインスタンスには中間リソースと、レンダーループの実装が含まれます。

軽量レンダリング

LW RP のレンダリング機能は、主にビルトインレンダラーのサブセットです。パフォーマンスの制限されるプラットフォームでのパフォーマンスを向上させるために、一部の機能が意図的に除外されています。Unity ではゲームに使用できるツールや技術を数多く提供していますが、時としてゲームのパフォーマンス能力の限界を超えた技術が間違って採用されてしまうというリスクがあります。特殊なレンダーパイプラインをテンプレートとして提供する目的は、ユーザーのミスによってパフォーマンスコストの高い問題が起こる可能性を抑えることにあります。ターゲットのプラットフォームに適さないポストプロセッシングエフェクトをデプロイすると、たとえ Unity がそのエフェクトに対応していて他のプラットフォームで正常に機能するとしても、デバイス上ではゲームが十分な動作速度を得られない可能性があります。

リアルタイムのグローバルイルミネーションも、LW RP のターゲットプラットフォームではめったに使用されない機能のひとつであり、したがって除外されています。唯一対応しているレンダリングパスはシングルパスフォワードレンダリングです。これも、レンダリングの緻密さよりもパフォーマンスを優先させたことによります。以下の表は、ビルトインのパイプラインと軽量パイプラインがそれぞれ対応している技術を詳しくまとめたものです。

Unity ビルトインパイプライン軽量パイプライン
対応プラットフォームすべてすべて
レンダリングパスマルチパスフォワード

マルチパスデファード

シングルパスフォワード
ライティングの減衰ポイントライトとスポットライトの減衰テクスチャを別々に事前計算

範囲の境界で、頂点ライトの強度が減衰によって 0 にはなりません。

シェーダー内で計算された減衰がライトの範囲でスムーズにフェードアウトします。スポットライトの内角と外角を設定できます。
色空間リニアワークフロー、sRGB ライト強度

sRGB

リニアワークフロー推奨、ガンマワークフローにも対応

リニアワークフローのライト強度

リアルタイムライトディレクショナルライト、スポットライト、ポイントライト

ピクセルライトの数を画質設定で制御

フォワードパス、最大で 8 つのピクセルライト

最大で 4 つの頂点ポイントライトに対応

ディレクショナルライト、スポットライト、ポイントライト

ピクセルライトの数をパイプラインアセットで制御

最大で 8 つのピクセルライト

最大で 4 つの頂点ポイントライトに対応

ライトモードベイクしたライティング

混合ライティング

Baked Indirect モード

シャドウマスク

距離シャドウマスク

Subtractive モード

リアルタイム

ベイクしたライティング

混合ライティング

Baked Indirect モード

リアルタイム

グローバルイルミネーションディレクショナルライト、スポットライト、ポイントライト、長方形エリアライト

ベイク済み

ライトマップ(ノンディレクショナルおよびディレクショナル)

ライトプローブ

リアルタイム

動的ライトマップ

リアルタイムライトプローブ

ディレクショナルライト、スポットライト、ポイントライト、長方形エリアライト

ベイク済み

ライトマップ(ノンディレクショナルおよびディレクショナル)

ライトプローブ

リアルタイム GI は非対応

ライトカリングオブジェクト毎、計算なしオブジェクト毎、計算なし
シェーダーライブラリ数十種類の特殊な非物理ベースシェーダー

以下の統合スタンダード PBS シェーダー

メタリックワークフロー

スペキュラーワークフロー

ラフネスワークフロー

統合スタンダード非物理ベースシェーダー(ほとんどの旧シェーダーおよびモバイル Lit シェーダーが含まれます)

統合スタンダードシェーダー(メタリックまたはスペキュラーワークフロー)

物理ベースシェーディングDisney 拡散 + Cook-Torrance(GGX、Smith、Schlick)スペキュラー

ランバート拡散 + 簡易 Cook-Torrance(GGX、簡易 KSK、Schlick)スペキュラー

ランバート拡散 + 非マイクロファセット LUT スペキュラー

ランバート拡散 + 簡易 Cook-Torrance(GGX、簡易 KSK、シュリック)スペキュラー
ライト CookieモノクロV1 では非対応
ライトプローブモード補間プローブ 1 つ

LPPV

補間プローブ 1 つ
リフレクションプローブオブジェクト毎に分類、最大 2 つのプローブ間でブレンドオブジェクト毎に分類、ブレンド無し
シャドウ関連機能PSSM ― Stable Fit および Close Fit

フィルタリング ― PCF

深度クリップなし。パンケーキが頂点で実行されます。

PSSM ― Stable Fit

フィルタリング ― PCF

深度クリップなし。パンケーキが頂点で実行されます。

シャドウモードライト空間

スクリーン空間

スクリーン空間
シャドウを落とすライトsディレクショナル、スポット、ポイント

シャドウを落とすライト複数に対応、パス毎に 1 つ

ディレクショナル、スポット

シャドウを落とすライト 1 つを主要ライトとして使用可

一般
カメラ深度値でカメラを分類

スタック管理

一般的なカメラのステートによるグループ分け

カメラ同士の間の深度ステート

深度値でカメラを分類

スタック管理なし

RenderTarget スケールに対応

スケールされた解像度でゲームがレンダーされる

UI がネイティブ解像度でレンダーされる

アンチエイリアシングMSAA、TAAMSAA
パイプラインの追加データモーションベクターなし
ポストプロセッシング旧ポストプロセッシングスタック

新ポストプロセッシングスタック

新ポストプロセッシングスタック・エフェクトのサブセット

【非対応】TAA・モーションブラー・SSR

デバッグオプションG バッファの表示

各種ベイクライティングのビューモードの表示

空のライティングプロシージャルスカイ

キューブマップの空/円筒投影マッピングの空

環境光ライティング

プロシージャルスカイ

キューブマップ

環境光ライティング

軽量レンダーパイプラインのカスタマイズ

スクリプタブルレンダーパイプラインのアーキテクチャは素晴らしい可能性を持っています。Unity におけるレンダリングはかつてなくオープンに、自在にカスタマイズできるようになったのです。軽量レンダーパイプラインのソースにアクセスしたい方は、スクリプタブルレンダーパイプラインの GitHub ページ をご確認ください。LW RP の C# ソースが入手可能となっており、修正してご自分のプロジェクトに適したパイプラインを作成していただけます。何か問題があった場合は、ぜひ GitHub のページからご連絡ください。また ベータフォーラムからもご連絡いただけます。

2018年2月21日 カテゴリ: テクノロジー | 7 分 で読めます

Is this article helpful for you?

Thank you for your feedback!

取り上げているトピック