📗

【Unity Summary】 RenderPipeline

2025/02/15に公開

reference:https://docs.unity3d.com/ja/current/Manual/Graphics.html

RenderPipeline

  • Scene の contents を取得し、画面に表示する一連の操作を行う
    1. Culling
    2. Rendering
    3. 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(カスタム・レンダーパイプライン)

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: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