レンダリングパイプラインをURPに移行した話

レンダリングパイプラインをURPに移行した話

こんにちは!
第2事業部エンジニアの佐久間です。

今回はあるプロジェクトのレンダリングパイプラインをビルトインからURPに移行したので、それについて話させて頂きます。

対象読者

・ビルトインからURPにレンダリングパイプラインを移行予定の方
・URPにすることで実際どのくらい負荷が軽減するのかが気になる方

URPとは

URP(Universal Render Pipeline)とは、Unityが提供しているレンダリングパイプラインのひとつになります。

Universal Render Pipeline overview

移行に至った経緯

開発中のプロジェクトで、ある程度リソースがある状態でしたが、移行に踏み切りました。

理由としては、以下になります。

・SRP Batcherの有効化
・Shader Graphの使用ができる
・Render Featureによるレンダリングパスのカスタマイズ性
・新しい技術に挑戦したい

一番理由として大きいSRP Batcherについて掘り下げていきます。

SRP Batcher

SRP Batcherを簡単に説明すると、同じシェーダーであれば別マテリアルでも1つのSetPassで描画してくれる機能になります。
詳細はUnityのブログに説明されています。

SRP Batcher:レンダリングをスピードアップ

これにより、CPUの負荷を軽減することができます。
どのくらい軽減することが出来たかの事例を挙げさせて頂きます。

負荷軽減

StatisticsのSetPass callsで差分を見てみます。

キャラクターモデルのみをシーン上に配置した時の差分です。

キャラクターモデルと背景モデルをシーン上に配置した時の差分です。

・キャラクターモデルのみの場合、22 -> 14
・キャラクターモデルと背景モデルの場合、245 -> 44
と大幅にSetPassCallが削減されています。

移行にあたって対応したこと

ビルトインからURPへの移行はPackageを入れただけで完了するわけではないので、一部抜粋して紹介させて頂きます。

シェーダーの移行

利用していたシェーダーは、
・Unityがデフォルトで用意してくれているもの
・内製シェーダー
の2種類がありました。

StandardやParticlesといったUnityがデフォルト用意してくれているものに関しては、
URP12の機能であるRender Pipeline Converterを使用して置換しました。

内製のシェーダーは、コンバーター等はないので手動で置換する必要があります。
また、それらをSRP Batcherに対応しないとURPにするメリットが薄れてしまうので対応しました。

ポストエフェクト

ポストエフェクトは、
・Post Processing Stack V2
・OnRenderImage()を使用したもの
の2種類がありました。

Post Processing Stack V2はURP12ではサポートされていないため、
URPのVolumeを使用して実装しました。

OnRenderImage()自体がURPでサポートされていないため、
Renderer Featureを使用して実装しました。

ライトの光の色の調整

LightコンポーネントのIntensityが1ではない場合、ビルトインとURPでライトの色が異なっています。

これは、ビルトインとURPで光の計算式が異なるからです。
・ビルトイン : GammaToLinearSpace(LightColor * LightIntensity)
・URP : GammaToLinearSpace(LightColor) * LightIntensity

この問題をエンジニア側でコンバーターを用意することによって解決しました。

最後に

SRP Batcherによる描画負荷の軽減や、Renderer Featureによる表現の自由度が増すのでURPに移行する意味は大きかったです。
今後のプロジェクトでもURPを含むレンダリング技術を向上できたらなと思います。

Aiming第2事業部では、共に働く仲間を募集中です!

採用ページはこちら:
中途採用ページ
新卒採用ページ