じゅころぐAR

ARのブログ

AR FoundationをURP(Universal Render Pipeline)に対応させる

AR FoundationでURPを使えるようにしました。自分用のまとめです。

f:id:jyuko49:20200517202833p:plain

URPとは

ユニバーサルレンダーパイプライン(Universal Render Pipeline)の略。
Universal RPという表記も見かけますが、本記事では短い表記のURPで統一します。

URPは軽量レンダーパイプライン(LWRP、Light Weight Render Pipeline)が置き換わったもので、

  • Unityのすべてのプラットフォームに対応
  • モバイル、AR、VRに適している
  • Shader Graphが利用できる

といった特徴があります。

将来的には、URPがUnityデフォルトのレンダーパイプラインになるようです。

blogs.unity3d.com

URP以外の選択肢として、より高機能・高品質なHDレンダーパイプライン(HDRP、High Definition Render Pipeline)があります。こちらは据え置き型のゲーム機やゲーミングPCなどハイエンドなデバイスをターゲットにしているため、ARで使うなら現状はURP一択になると思います。

AR FoundationでURPを有効にする

AR Foundationでは3.0.0からURPに対応しており、手順がUnityフォーラムで紹介されています。

Unity - Configuring AR Foundation 3.0.0-preview to work with LWRP or URP - Unity Forum

Universal RPのインストール

新規でUnityプロジェクトを作成する場合、テンプレートで"Universal Render Pipeline"を選択すると必要なパッケージやサンプルシーンがインストール済みの状態でプロジェクトが作成されます。

f:id:jyuko49:20200517104557p:plain

今回は既存プロジェクトの移行を想定して、上記のテンプレートは使用せずPackage Managerでインストールしていきます。
使用しているUnityのバージョンは2020.1です。

  • Unity 2020.1.0b3(ベータ)

"Window" > "Package Manager"でUniversal RPをインストールします。

  • Universal RP 8.0.1

f:id:jyuko49:20200517105559p:plain

Universal RPをインストールすると、Shader Graphも併せてインストールされるはずです。
有効になっていなかったら追加してください。

  • Shader Graph 8.0.1

ついでにAR Foundatuonも追加しておきます。今回はプラットフォームをiOSにするので、ARKit XR Pluginもインストールします。

  • AR Foundation 3.1.3
  • ARKit XR Plugin 3.1.3

Pipeline Assetの設定

先ほどリンクしたUnityフォーラムの記事とは一部異なる手順で作成します。

最初にPipeline Assetを作成します。こうすることでFowrad Rendererが同時に作られます。
名称は"ARFoundationUniversalRenderPipelineAsset"にしました。

f:id:jyuko49:20200517111710p:plain

Asset内に"ARFoundationUniversalRenderPipelineAsset.asset"(Pipeline Asset)と"ARFoundationUniversalRenderPipelineAsset_Render.asset"(Fowrad Renderer)ができているはずです。

f:id:jyuko49:20200517112119p:plain

Pipeline AssetをInspectorで表示すると、同時に作成されたFoward Rendererが"Renderer List"に設定されています。こちらは変更の必要がありません。

f:id:jyuko49:20200517112641p:plain

次にInspectorでForward Rendererの設定を行います。

まず、"Post Process Data"がNoneになっているため、デフォルトのPost Process Dataを設定します。
非表示になっている場合は、目の形をしたアイコンをクリックすると表示されます。

f:id:jyuko49:20200517113240p:plain

続いて、"Renderer Feature"に"AR Background Render Feature"を追加します。
"AR Background Render Feature"はAR FoundationのARBackgroundRendererFeature.csで定義されています。

f:id:jyuko49:20200517113759p:plain

最後に"Project Settings" > "Graphics"の"Scriptable Render Pipeline Settings"に作成したPipeline Assetをセットします。

f:id:jyuko49:20200517114123p:plain

ここまでの設定でURPが有効になります。

URPを使ってみる

Light、Shadowの利用

ライティングの基本的な実装は、以下のUnity Blogで学習することができます。

blogs.unity3d.com

その他、以下の記事も参考にさせて頂きました。

ざっくりと説明すると、

  • HLSLスクリプトでライトの情報を取得する
  • Shader Graphで上記の値を利用したシェーダーを作る

という流れになります。

Shader Graphでシェーダーを作成する

Shader Graphをインストールしていれば、Shader作成時に"Unlit Graph"、"PGR Graph"、"VFX Shader Graph"などが追加されています。
公式のチュートリアルに倣って、"Unlit Graph"から作成しています。

f:id:jyuko49:20200517122451p:plain

作成したShader GraphをAssetsでダブルクリックするか、Inspectorで"Open Shader Editor"をクリックすると、Shader Editorが開きます。
この画面でノードを追加していくと様々なシェーダーが作成できます。

f:id:jyuko49:20200517123924p:plain

Shader Graphの詳細については長くなるので割愛しますが、Unityのシェーダーグラフのページの下の方から、公式のチュートリアル動画やUnity Blogに飛べます。

ライトの情報を取得する

Shader Graphで作成する場合でも、ライト情報の取得部分はHLSLで記述する必要があるようです。

"Create Node" > "Custom Function"にて、Shader Graphで任意のHLSLスクリプトを実行するノードが作成できます。

f:id:jyuko49:20200517125629p:plain

実行するスクリプトはノードに直接記述(String)か、HLSLファイルを参照(File)の2パターンが選べます。

f:id:jyuko49:20200517131122p:plain

この辺りはUnity Blogで解説されており、ファイルに記述するパターンのサンプルがGithubで公開されています。

HLSLスクリプトではGetMainLight()を実行するとメインライト、GetAdditionalLight()を実行するとメインライト以外の複数のライト情報が取得できます。

該当の処理は以下。

Light light = GetMainLight();
Direction = light.direction;
Color = light.color;

関数で取得したライトの情報をCustom FunctionノードのOutput(上記の例ではDirection、Color)に追加することで、後続のノードでライト情報を利用したシェーダーを作成できます。

GetMainLight()GetAdditionalLight()は、Universal RPパッケージのShader Library内にあるLighting.hlslで定義されています。
HLSLでシェーダーを記述する際には、こちらのShader Library内を参照するとよさそうです。

f:id:jyuko49:20200517132129p:plain

ライトの取得方法がわかったので、Unity Blogの記事を参考にシェーダーを作成していきます。試行錯誤しながら平面に影を落とすシェーダーと複数のライトの影響を受けるシェーダーを作成しました。

カメラ背景の変更

過去の記事で紹介したカメラ背景の切り替えがURPでも行えます。

www.jyuko49.com

AR Foundation(ARKit XR Plugin)のバージョンによってシェーダーが異なるのですが、3.1.3の場合はARKitBackground.shader内にPipelineごとの分岐が入っており、こちらをベースにシェーダーを作成すればカメラ背景をカスタマイズできます。

ARKit XR PluginのバージョンによってはPipelineごとにシェーダーファイルが分かれており、ARKitBackground.shaderとは別にARKitURPBackground.shaderが存在していることがあります。

f:id:jyuko49:20200517194506p:plain

この場合はARKitURPBackground.shaderを編集して、シェーダーを作成していきます。

詳細は過去記事を参照ください。

エフェクトの使用

URPに切り替えを行ったことでShader Graphで作成したエフェクトが利用できます。

Shader Graphを使ったエフェクトの作成方法に関しては、たくさんの記事やサンプルがあるので本記事では割愛します(初心者ですし)

なお、エフェクト作成の基礎は以下の書籍で学習しました。
Shader Graphの説明も手厚く書かれており、一冊通して行えば頻出パターンに慣れることができるので入門には最適かと思います。

Unity ゲームエフェクト マスターガイド

Unity ゲームエフェクト マスターガイド

  • 作者:秋山 高廣
  • 発売日: 2019/07/19
  • メディア: 単行本(ソフトカバー)

デモ

URPでLight、Shadow、Camera Background、Effectを全部乗せたARを試してみました。

エフェクトに連動してカメラ背景を切り替え、エフェクトに追加したライトが平面に映るようにしています。
平面にはオブジェクトの影も映ります。

まとめ

AR Foundationで作成したプロジェクトをURPに対応させて、影を落とす、ライトを反映させる、カメラ背景を変更する、エフェクトを使うといった基本的な実装を試してみました。
実装方法は異なるものの、今までできていたことができないということはなさそうです。

パフォーマンス面の効果は比較できていないですが、今後はURPがUnityの標準になるということもあり、早めに切り替えて実装に慣れておいた方がよさそうです。