Search Unity

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

, 2月 21, 2018

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

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

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

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

軽量レンダーパイプラインは、幅広いモバイルプラットフォーム向けの開発や、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、TAA MSAA
パイプラインの追加データ モーションベクター なし
ポストプロセッシング 旧ポストプロセッシングスタック

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

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

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

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

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

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

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

環境光ライティング

プロシージャルスカイ

キューブマップ

環境光ライティング

 

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

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

 

16 コメント

コメントの配信登録

コメント受付を終了しました。

  1. TonyVT Skarredghost

    3月 29, 2018 10:25 pm

    A very interesting work… wow!

  2. Since mixed mode is not fully supported LWRP does not worth for the moment

  3. George Cook

    2月 26, 2018 5:21 pm

    Question: I note the list of lightweight ready shaders doesn’t mention unlit shaders. How hard will it be to convert our shaders to this pilepline? you guys got any info on that, please? That’s the only thing that will stop me pulling the trigger.

    Also, anyone got any performance metrics on this for VR? i.e. Lightweight vs 2017 standard renderer pipeline?

    1. Matt Schell

      2月 28, 2018 3:04 pm

      From the article: “It’s worth noting that all Unity’s unlit stock shaders work already with LW RP. ” Hope that helps.

    2. Matt Schell

      2月 28, 2018 3:05 pm

      Coming soon!

  4. Table shod be extended to explain Lightweight VR, 3D Ultra, and HD pipeline.

    1. – Lightweight VR is the same as this pipeline (mostly) with more components for VR
      – 3D Ultra is builtin as you have now but with settings maxed out
      – HD pipeline is still WIP, they don’t fully know the limits, but it will be addressed in it’s own blog

      As this blog is about lightweight, it stands to reason it’s best to compare lightweight with existing built in. That’s how I’ve understood it anyway.

  5. Similar article for HD Pipeline? Pretty please?

  6. imaginaryhuman

    2月 21, 2018 4:24 pm

    Could you make a super ultra lightweight (fast) render pipeline just for 2D which is even more performant than the lightweight one, which completely ignores all 3D features and lighting etc?

    1. 3D with no lighting would also be great. I hope the system is easy enough to use that all our needs can be met without too much trouble.

      1. Matt Schell

        2月 28, 2018 3:06 pm

        As someone else mentioned, this should be achievable now using unlit shaders, unless I misunderstand your point.

    2. @imaginaryhuman that pipeline is called Unlit Shaders.

    3. Nicholas G Korta

      2月 22, 2018 6:29 pm

      I’m pretty sure if Unity does not do it them selves someone will put one on the Asset Store :)

      1. Matt Schell

        2月 28, 2018 3:07 pm

        The fact that this is a more open architecture means that yes, I think we will see many unique asset store solutions being offered for more specific pipeline needs.

  7. Awesome! I note there is a limitation of one shadow casting light at a time. I wondered what strategies there would be for moving between lights that should in theory cast a shadow. I’m reminded of the technique in Windwaker where they lerped the cast “light” from light to light as you got in range. What would be an efficient way to do it here (if necessary?) in order to enhance the quality of LW without extra cost?

  8. Abhimanyu Aryan

    2月 21, 2018 2:29 pm

    Great article. Much needed