685 Views
January 31, 19
スライド概要
2019/1/30に開催されたUnity道場 1月 ~LWRPとシェーダー~の講演スライドです。
講師:山村達彦 (ユニティ・テクノロジーズ・ジャパン合同会社)
Unityのイベント資料はこちらから:https://www.slideshare.net/UnityTechnologiesJapan/clipboards
リアルタイム3Dコンテンツを制作・運用するための世界的にリードするプラットフォームである「Unity」の日本国内における販売、サポート、コミュニティ活動、研究開発、教育支援を行っています。ゲーム開発者からアーティスト、建築家、自動車デザイナー、映画製作者など、さまざまなクリエイターがUnityを使い想像力を発揮しています。
軽量レンダーパイプライン Light Weight Renderer Pipeline …とは Tatsuhiko Yamamura @ Unity
今までと概ね同じ表現
カスタムシェーダーで面白表現
パイプラインをカスタマイズ
軽くて、早い Unity Standard(ms) LWRP(ms) 45.98 One Plus 5T 16.65 45.87 Galaxy S7 16.72 61.23 Galaxy S5 51.62 27.23 iPhone 6S 16.8 0 17.5 35 1 Directional Light、 MSAA LWRP 2.0.4, Unity 2018.2b06 52.5 70
LWRP …とは
HDRP High-Definition-Render-Pipeline LWRP Lightweight-Render-Pipeline
HDRP High-Definition-Render-Pipeline LWRP Lightweight-Render-Pipeline • PS4やハイエンドPC向け • モバイルやXR向け • 忠実度の高いビジュアル • 軽量・高速が優先
今までのレンダリングパイプラインと 幾つかの機能が異なる https://github.com/Unity-Technologies/ScriptableRenderPipeline/blob/master/com.unity.render-pipelines.lightweight/Documentation%7E/lwrpbuiltin-feature-comparison.md
LWRP 何が良いの? •パフォーマンスに良い • Light Weight Forward Renderer • Smartなシェーダー •カスタマイズが簡単に出来る • ゲーム独自のエフェクトを追加出来る • 不要な機能を削れる
リニアカラーへ変更 Lightweight RP パッケージ導入 導入 手順 Lightweight RP Assetの作成 Lightweight RPを設定 シェーダーの差し替え 絵の調整
Demo
LWRP Built in
エディターワークフローは殆ど変わらない
何が 変わるのか
scriptable shader variants stripping SRP Batcher SRP OSS Shader Graph 絵作り Frame Debugger Custom Path Shader ライト戦略 LWRP カスタマイズ LWRP Lit Lighting Shadow Single Path Forward GI
Single Path Forward Rendering LWRP Builtin 1 Passで4個のライトを 一括で描画 ライトの数だけ 重ね塗り
Single Path Forward Rendering 範囲が重複しても まぁ大丈夫 でも範囲が小さいライト を沢山置くと、 チカチカするので注意
ライトマップのベイク •GIの表現は殆ど今まで通り • Realtime GIは非対応 • Progressive light mapper GPU accelerationは対応 •Mixed Lightは現状 Subtractiveのみ • Unity 2019.1でBaked Indirectと Shadow Maskに対応予定(未実装)
ライト戦略 Main Light Additional Light
ライト戦略
LWRPは対応シェーダーを要求 •LWRPはStandardShaderに は対応していない • 正確にはSRPがSurface Shaderを 使用できない状態 •対応するShaderに差し替える • Update Project Materail To LightWeight Render Pipelineで、プロジェクト内のマテリアルを 一気に更新
• プロジェクトが使用しているシェーダーを、LWRP対応のシェーダーへ 一気に差し替えるオプション • 個別(選択しているマテリアル一覧)を一括変更するオプションもある
•自動差替は、 特定の組み合わせで 行われる •ココに無いものは 差し替えられない https://github.com/Unity-Technologies/ScriptableRenderPipeline/blob/master/com.unity.render-pipelines.lightweight/ Documentation%7E/upgrading-your-shaders.md
LWRP/Lit LWRPは対応Shader Standard Shader 比較的重い(Simple Litと比較) フォトリアル表現向け PBR Lit Simple Lit PBRではない 低スペック端末向け 要微調整
他のシェーダーはどうか? • SurfaceShaderを使用していなければ 案外動く事も多い • Trash Dashデモはほとんど Unlitなので問題なく動作 • SpriteやUIも動作
Fine PrunedTile Lighting Layered Material Execute Renderer HDRP Lit Shader Generate Light Data Generate Camera Data Culling Filtering Sorting HDRP SRP Scriptable Render Pipeline ビルトインパイプラインとは根本的に異なる others Single Path Forward LWRP Lit Shader others LWRP
大は小を兼ねない事もある
好きな組み合わせで作っても良い
SRP(&LWRP-HDRP)はオープンソース
2019.1 2019.2 2019.3 2019.4 2020.1 Unity 4.0 4.1 5.0 4.2 LWRP 4.0 0.1 MyRP 0.2 4.0a 0.3 0.4
SRPを勉強する上で参考になる資料 • SRPとは何か • SRPを活用すればどんな事 が出来るようになるのか • LWRPをカスタムする ポイント https://www.slideshare.net/UnityTechnologiesJapan/ gtmf2018scriptablerenderpipeline
ビルトインパイプラインのバッチング Material A Material B Material B Material C Shader 1 Shader 1 Shader 1 Shader 2 1 Draw Call 1 Draw Call 1 Draw Call 1 Draw Call
ビルトインパイプラインのバッチング Material A Shader 1 Constant Buffer 作成 Constant Buffer アップロード 描画を 発行
ビルトインパイプラインのバッチング 1 Draw Call 1 Draw Call 1 Draw Call
ビルトインパイプラインのバッチング • フレーム毎にCPUで構築するのは コストが高く、Z精度も悪い • OpenGLES2以下では 確かに有益だった (ES3以降は無くても良い) • Dynamic Batchingは 3Dテンプレートでは既にOFF • 代わりにInstancingを使う
SRPBatching Material A Shader 1 C Buffer Cache Constant Buffer アップロード 描画を 発行
SRPBatching Constant Bufferを 配列にコピー For Each Material C Buffer 1 C Buffer 2 C Buffer 3 同じShader Keyword の組み合わせでまとめる Linear Constant Buffer アップロード 描画 C Buffer 1 C Buffer 2 C Buffer 3 offsetでbufferを 切り替えながら描画 描画頻度を減らすのではなく、 描画命令を安くするアイディア
一括描画した オブジェクトの個数 バッチが途切れる理由 ノードが異なる シェーダキーワードを使用
SRPBatching • PS4、DX11、 Metal、 Vulkanで動作 (OpenGLESでは動作せず) • 全てのMaterial PropertyをUnityPerMaterialの CBUFFERの中に入れる必要あり。 • LWRP Shaderは特に何もしなくても良い
UberShaderは柔軟だが膨らむ COLOR_ORANGEかつOP_ADDなシェーダー COLOR_ORANGEかつOP_MULなシェーダー COLOR_ORANGEかつOP_SUBなシェーダー COLOR_VIOLETかつOP_ADDなシェーダー COLOR_VIOLETかつOP_MULなシェーダー COLOR_VIOLETかつOP_SUBなシェーダー COLOR_GREENかつOP_ADDなシェーダー COLOR_GREENかつOP_MULなシェーダー COLOR_GREENかつOP_SUBなシェーダー COLOR_GRAYかつOP_ADDなシェーダー COLOR_GRAYかつOP_MULなシェーダー COLOR_GRAYかつOP_SUBなシェーダー
Scriptable shader variant stripping • ゲームが使用しない ShaderのVariantの組み合わせを ストリップ(削除)する • アプリサイズとビルド時間短縮 ついでにメモリに優しい
Scriptable shader variant stripping • ストリップ条件 • 未使用なシェーダー • 未使用なパス • 無効な組み合わせ • 無効化された機能
Scriptable shader variant stripping Unstripped Stripped 31,080 Player Data Shader Variant Count 7,156 0 8000 16000 24000 32000 121 Player Data Size on disk 116 0 32.5 65 97.5 130 839 Player Build Time(sec) 286 0 225 450 675 900
\おーーーい/
パス自作
パス自作
Demo
• パイプラインに新しくパスを追加 • 画面を解像度を下げてコピー • 描画結果を_GrabTextureとして参照できるように • シェーダーを用意 • _GrabTextureの結果を使って解像度の低い画面を描画 • 画像を反転もしてみた
Grabに関しては、 こんな事をしなくても _CameraDepthTextureと _CameraOpaqueTextureで テクスチャを取得出来る
• Passを挿入出来る タイミング一覧
• IRenderSetupで パイプラインをオーバーライド • LWRP自体を改造せず 独自のパイプラインを構築
LWRP…とは? • 広い端末で動作 • 高速なシェーダー • 簡単に使える • 高いカスタマイズ性 • 新しいバッチング • 簡単に拡張できる • モダンなレンダリング • モバイルにフォーカス
おしまい