📗
【Unity Summary】 RenderPipeline
reference:https://docs.unity3d.com/ja/current/Manual/Graphics.html
RenderPipeline
- Scene の contents を取得し、画面に表示する一連の操作を行う
- Culling
- Rendering
- Post Processing
- 機能や性能が異なる 3 つの Built-in RenderPipeline に加え、自作 RenderPipeline も使用可能
- Buit-in RenderPipeline
- "S"RP(スクリプタブル・レンダーパイプライン)
- "U"RP(ユニバーサル・レンダーパイプライン)
- "HD"RP(HD・レンダーパイプライン)
- Nintendo Switch, iOS, Android, Mobile VR, Hololens への使用は非推奨
- "C"RP(カスタム・レンダーパイプライン)
- Buit-in RenderPipeline
Rendering の仕組み
- Scene の Object がどのように表示されるかを 3 つの主要な段階で決定
- 最初の Step は Culling
- Rendering する必要のある Object、Camera に見える Object と他 Object によって隠されていない Object(Occlusion Culling)を列挙する
- 次の Step は Rendering
- Culling 済 Object を、適切な Lighting といくつかの property とともに、Pixel base の Buffer に描画する
- 最後の Step は Buffer に対する PostProcess 操作
- 例えば、Color Grading、Blume、被写界深度を適用して、「display device に送信する最終的な出力 frame」を生成する
設定方法
- Graphics と Quality の両方の設定によって active な RenderPipeline が決まる
setting | description |
---|---|
Graphics | default で使用する RenderPipeline |
Quality | 特定の Quality level に対して、指定した RenderPipeline で Override する |
Buit-in RenderPipeline
Graphics Tier
- 異なる性能の Hardware で実行する場合に、様々な Graphics 設定を適用可能
- Unity が最初に Application を load する際に、Hardware と Graphics API を確認した上で、現在の環境がどの Tier に対応しているかを判定
SRP(スクリプタブル・レンダーパイプライン)
reference:https://www.slideshare.net/UnityTechnologiesJapan/gtmf2018tokyoscriptablerenderpipeline
- C# Script を使って Rendering を制御する機能
- URP と HDRP を支える技術
- C# Script を使用して Rendering コマンドの schedule と設定を行うための薄い API Layer
- これらのコマンドを Unity の低 level の Graphics Architecture に渡し、Graphics API に指示を送信する
- IContextObject:データを格納する interface
- IBuildTask:build の処理を担当する interface
- BuildTaskRunner の Task 一覧に登録した順に
Run()
が呼ばれる - 使用するデータは[InjectContext]で field に自動的に注入される
- BuildTaskRunner の Task 一覧に登録した順に
- BuildTaskRunner:build を実行するクラス
properties | description | note |
---|---|---|
RenderPipeline Instance | RenderPipeline の機能を定義する class の Instance | RenderPipeline を継承し、Render() を override する必要あり |
RenderPipeline Asset | どの RenderPipeline Instance を使用・設定するかについてのデータを保存する Asset | RenderPipelineAsset を継承し、CreatePipeline() を override する必要あり |
ScriptableRender Context | RenderPipeline のカスタム C# code と Unity の低 level Graphic code 間の interface として機能する Class |
URP(ユニバーサル・レンダーパイプライン)
- URP はアーティスト向けの Workflow を提供し、mobile からハイエンドの Console や PC まで、幅広い platform で最適化された Graphics を素早く簡単に作成
HDRP(HD レンダーパイプライン)
- Highend Platform 向けの最先端の忠実度の高い Graphics を作成可能
CRP(カスタムレンダーパイプライン)
- SRP に基づいた独自のカスタム RenderingPipeline
使用する際に必須となるもの
RenderPipeline Instance
- 「RenderPipeline」を継承し
Render()
を override した Script - ここにカスタムの Rendering code を記述する
RenderPipeline Asset
- 「RenderPipelineAsset」を継承し
CreatePipeline()
を override した Script
RenderPipeline Asset(RenderPipelineAsset Script から作成)
- RenderPipelineAsset Script から作成
- RenderPipeLine Instance の Factory class として機能
details
ExampleRenderPipelineAsset.cs
using UnityEngine;
using UnityEngine.Rendering;
// CreateAssetMenu 属性によって Unity Editor にて、このクラスの instance の作成が可能になる
[CreateAssetMenu(menuName = "Rendering/ExampleRenderPipelineAsset")]
public class ExampleRenderPipelineAsset : RenderPipelineAsset
{
// 最初の frame を Rendering する前に、Unity によってこの method が呼び出される
// RenderPipeline Asset の設定が変更された場合は、Unity は現在の RenderPipeline Instance を破棄し、次の frame をRendering する前に再度、このメソッドを呼び出す
protected override RenderPipeline CreatePipeline() {
// このカスタムの SRP が Rendering のために使う RenderPipeline を instance 化
return new ExampleRenderPipelineInstance();
}
}
ExampleRenderPipelineInstance.cs
using UnityEngine;
using UnityEngine.Rendering;
public class ExampleRenderPipelineInstance : RenderPipeline
{
public ExampleRenderPipelineInstance() {
}
protected override void Render (ScriptableRenderContext context, Camera[] cameras) {
// ここにカスタム Rendering code を記述(SPR をカスタマイズするために、この method をカスタマイズする)
}
}
Lighting
mode
properties | description |
---|---|
Baked | - Light からの直接光と間接光を Light Map に Bake する - Runtime コストなし |
RealTime | - 直接照明と影は RealTime であるため、Light Map には Bake されない - Runtime コストが高い |
Mixed | Bake と RealTime の特徴を組み合わせた hybrid mode |
Rendring Path
- Rendering Path は、Lighting と Shading に関連する一連の操作のこと
- Graphics Window で選択
Forward Rendering(フォワードレンダリング)
- Default
- RealTime の Light は、Forward Rendering で描画するには非常に負荷がかかる
- このコストを相殺するために、Unity が「一度に Pixel ごとに Rendering する Light の数」を選択する
- Scene の残りの Light は「頂点 または Object 毎」など、より低い忠実度で描画される
- 各 Object を 1 つ、または複数の Path で描画
- Path 数は Object に作用する Light によって決定
Deferred Shading(遅延)
- Buit-in RenderPipeline で最も Light と影の忠実度が高い Redering Path
- GPU サポートを必要とし、いくつかの制限がある
- 以下は対象外
- 半透明の Object(Forward Rendering 使用)
- 平行投影(Camera に Forward Rendering 使用)
- Hardware のアンチエイリアス
- Post Processing を使用して同様の結果を得られる
- CullingMask のサポートに制限があり、
Renderer.receiveShadows
フラグを常に true として扱う
- 以下は対象外
- Lighting の処理オーバーヘッドは、Object を照らす数に関係なく、「Scene の中の Light の volume の size」によって決定される
- したがって、パフォーマンスは Light を小さくすることによって向上する
Command Buffer
- Rendering Command(Redner Target の設定や、指定した Mesh の描画など)のリストが格納されてる
- Built-in RenderPipeline の様々な時点でスケジュールして実行するように Redering 機能をカスタマイズして拡張可能
Material
- Unity で何かを描くには、以下2つの情報が必要
- 形状(Mesh)
- 表面の外観(Material)
- Material と Shader は密接な関係にあり、Material は常に Shader と一緒に使われる
Advanced Options
options | description | note |
---|---|---|
Render Queue | Render Queue の選択 | Render Queue の Default 値は Material の Shader が決定 |
Enable GPU Instancing | Material を使用する Mesh の Draw call を最適化する | |
Double Sided Global Illumination | Progressive Light Mapper に Global illumination の計算に際して裏面を考慮するよう指示する | 有効にすると 裏向き Polygon が前向き Polygon と同じ emission 値 及び albedo 値を使用して光を反射させる |
Material Variant
- 1 つのゲームのために何百もの Material を作成することがあり、これらの Material の変更の管理や調整は非常に手間のかかる作業である
- Material Variant を使うことで、簡単に行うことが可能
copy vs variant
- 変更された場合
type | result |
---|---|
copy | 変更が加えられても自動的に変更され"ない" |
variant | 親に変更が加わると自動的に変更される |
- 変更制限
type | result | |
---|---|---|
copy | 制限"不可" | |
variant | 制限可 | Material または Material variant の 1 つまたは複数の property を lock して、子 property の修正を防ぐことが可能 |
Prefab Variant vs Material Variant
- Material Variant では、1 つまたは複数の property を lock して、子 variant 内でその property を編集不可とすることが可能
- 親は変更可能
Discussion