たぬきちのふていきぶろぐ

日々のできごと、技術ブログ、セミナーおぼえがきをお届けしていきます

【GTMF2018】【Unity】Scriptable Render Pipline

講演者:黒河優介
所属団体:Unity Technology Japan

unity新機能紹介

アジェンダ
①デフォルトで備えているunityのレンダリングパイプラインについて
②新機能のパイプラインについて
③事例紹介
※本講演ではフォワードレンダリングについてのみお話しています

【1.デフォルトのパイプライン】
描画、ライト、シャドウの扱いについて
・opaque:手前から奥の順に描画していく手法。
・transparent:奥から手前の順に描画していく手法。半透明や抜きの描画に使用。

この二者では、opaqueの方が、二重にレンダリングされる箇所が少ないため負荷が少ない。

旧パイプラインでもう少し細かく描画を制御したい時は、カメラを複数用意してDepthを制御したり、render sorting layerを使用して制御してきました。
ただ、この手法はUnityのルールを熟知していないと、描画順を指定するのはかなり難しいです。
また、shadowの扱いについて、Unityではこれまでソースを非公開にしてきました。そのため、描画処理自体がブラックボックス化しており、新しく外部から手を入れることが難しかったかと思われます。
そのため、今回ご紹介する新パイプラインが生まれました。

【2.新機能パイプラインについて】
【2-1.「SPR」機能紹介】
scriptable render pipline(SPR)
⇨描画の処理をスクリプトで書くことができるようになりました

以下のものもスクリプトで処理が可能です
・カリング
・オブジェクトのレンダリング
・shadowの処理
・ポストプロセシング
※ポストプロセシングとは、画面に表示する前に、フルスクリーンのフィルターとエフェクトをカメラの画像バッファに適用する処理

■SPR導入方法
1.render pipline asretを継承したクラスを定義
2.graphic settingで設定
3.shaderの書き換え

■SPR導入についての注意
導入により、下記の点に注意が必要となる
・cameraコールバックは呼び出されなくなるため、image effect系の実装をし直す必要がある
・surfes shaderはSPR未対応
もしSPRを使うなら、ライトの計算は自分ですること。加え、shader graphという機能から書き換えること

【2-2.Light Weghit Render Pipline(LWPR)の紹介】

下記のものを設計中
A.モバイル向け軽量レンダリングパイプライン
B.ハイエンド特化型レンダリングパイプライン

なぜ用途に応じたレンダリングパイプラインを設計してるかというと、用途により機能を削ることで、レンダリング性能の最適化を図るためです。

■LWPR導入方法
A.package managerでの取得(オススメ)
B.Git hubからソースを取得(カスタマイズしたい人向け)

いずれも、shaderをLWPR対応のものに置き換える必要があり、一括置換するための方法も後ほどご紹介します

▷LWPR注意点
・post processing stack v2
・shader graph
・Core PR
を消さないでください

▷ shaderの一括置換
shader include path属性
ルートパスを複数指定できるようになるため、相対パス絶対パスの指定が不要になる。
LWPR導入時にパスの指定がかなり複雑になるため、この属性を使うことをオススメします。

▷stripping scriptable variants
2年前にリリースされた機能で、
ユーザー側で使用しないシェーダーの仕組みを除外してビルドする機能。
だが、LWPR2.0には対応してない。

【2-3.新機能SPR Batcher】
デフォルトでは描画をするのに変数を一回一回呼び出していたが、永続的に呼び出す形に変更し、描画にかかるCPU負荷を減らす形にした。
だが、まだ実用レベルではないので将来的に実装予定。

【3.事例】
「0から独自のレンダーパイプラインを作った話」

「手前から奥」の描画と「奥から手前」に描画のレンダリング速度を比較検証。
通常であれば「奥から手前」の方が余分な描画がへるのでスピードが上がるのだが、「手前から奥」でも、Z値を書いておくことで、「奥から手前」の描画ルールを無視でき、破綻しない上にレンダリング速度が速くなった。