最近のブログ記事で、スクリプタブルレンダーパイプライン(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 のページからご連絡ください。また ベータフォーラムからもご連絡いただけます。
Is this article helpful for you?
Thank you for your feedback!