AR FoundationでURPを使えるようにしました。自分用のまとめです。
URPとは
ユニバーサルレンダーパイプライン(Universal Render Pipeline)の略。
Universal RPという表記も見かけますが、本記事では短い表記のURPで統一します。
URPは軽量レンダーパイプライン(LWRP、Light Weight Render Pipeline)が置き換わったもので、
- Unityのすべてのプラットフォームに対応
- モバイル、AR、VRに適している
- Shader Graphが利用できる
といった特徴があります。
将来的には、URPがUnityデフォルトのレンダーパイプラインになるようです。
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"を選択すると必要なパッケージやサンプルシーンがインストール済みの状態でプロジェクトが作成されます。
今回は既存プロジェクトの移行を想定して、上記のテンプレートは使用せずPackage Managerでインストールしていきます。
使用しているUnityのバージョンは2020.1です。
- Unity 2020.1.0b3(ベータ)
"Window" > "Package Manager"でUniversal RPをインストールします。
- Universal RP 8.0.1
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"にしました。
Asset内に"ARFoundationUniversalRenderPipelineAsset.asset"(Pipeline Asset)と"ARFoundationUniversalRenderPipelineAsset_Render.asset"(Fowrad Renderer)ができているはずです。
Pipeline AssetをInspectorで表示すると、同時に作成されたFoward Rendererが"Renderer List"に設定されています。こちらは変更の必要がありません。
次にInspectorでForward Rendererの設定を行います。
まず、"Post Process Data"がNoneになっているため、デフォルトのPost Process Dataを設定します。
非表示になっている場合は、目の形をしたアイコンをクリックすると表示されます。
続いて、"Renderer Feature"に"AR Background Render Feature"を追加します。
"AR Background Render Feature"はAR FoundationのARBackgroundRendererFeature.cs
で定義されています。
最後に"Project Settings" > "Graphics"の"Scriptable Render Pipeline Settings"に作成したPipeline Assetをセットします。
ここまでの設定でURPが有効になります。
URPを使ってみる
Light、Shadowの利用
ライティングの基本的な実装は、以下のUnity Blogで学習することができます。
その他、以下の記事も参考にさせて頂きました。
- Unity の Universal Render Pipeline のレンダリング周りについて勉強してみた - 凹みTips
- UniversalRPでなんちゃってMToonシェーダーを作ってみた話 – ギャップロ
- Unity2019.3 URP ShaderGraph Unlit マスターで影を受ける
- C# - Unity Universal RP における影のみの描画とレイヤーを用いた透過|teratail
ざっくりと説明すると、
- HLSLスクリプトでライトの情報を取得する
- Shader Graphで上記の値を利用したシェーダーを作る
という流れになります。
Shader Graphでシェーダーを作成する
Shader Graphをインストールしていれば、Shader作成時に"Unlit Graph"、"PGR Graph"、"VFX Shader Graph"などが追加されています。
公式のチュートリアルに倣って、"Unlit Graph"から作成しています。
作成したShader GraphをAssetsでダブルクリックするか、Inspectorで"Open Shader Editor"をクリックすると、Shader Editorが開きます。
この画面でノードを追加していくと様々なシェーダーが作成できます。
Shader Graphの詳細については長くなるので割愛しますが、Unityのシェーダーグラフのページの下の方から、公式のチュートリアル動画やUnity Blogに飛べます。
ライトの情報を取得する
Shader Graphで作成する場合でも、ライト情報の取得部分はHLSLで記述する必要があるようです。
"Create Node" > "Custom Function"にて、Shader Graphで任意のHLSLスクリプトを実行するノードが作成できます。
実行するスクリプトはノードに直接記述(String)か、HLSLファイルを参照(File)の2パターンが選べます。
この辺りは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内を参照するとよさそうです。
ライトの取得方法がわかったので、Unity Blogの記事を参考にシェーダーを作成していきます。試行錯誤しながら平面に影を落とすシェーダーと複数のライトの影響を受けるシェーダーを作成しました。
URPでLightingとShadowの実験 pic.twitter.com/AouHp0k0d5
— jyuko🐼 (@jyuko49) 2020年5月16日
カメラ背景の変更
過去の記事で紹介したカメラ背景の切り替えがURPでも行えます。
AR Foundation(ARKit XR Plugin)のバージョンによってシェーダーが異なるのですが、3.1.3の場合はARKitBackground.shader
内にPipelineごとの分岐が入っており、こちらをベースにシェーダーを作成すればカメラ背景をカスタマイズできます。
ARKit XR PluginのバージョンによってはPipelineごとにシェーダーファイルが分かれており、ARKitBackground.shader
とは別にARKitURPBackground.shader
が存在していることがあります。
この場合はARKitURPBackground.shader
を編集して、シェーダーを作成していきます。
詳細は過去記事を参照ください。
エフェクトの使用
URPに切り替えを行ったことでShader Graphで作成したエフェクトが利用できます。
Shader Graphを使ったエフェクトの作成方法に関しては、たくさんの記事やサンプルがあるので本記事では割愛します(初心者ですし)
なお、エフェクト作成の基礎は以下の書籍で学習しました。
Shader Graphの説明も手厚く書かれており、一冊通して行えば頻出パターンに慣れることができるので入門には最適かと思います。
- 作者:秋山 高廣
- 発売日: 2019/07/19
- メディア: 単行本(ソフトカバー)
デモ
URPでLight、Shadow、Camera Background、Effectを全部乗せたARを試してみました。
— jyuko🐼 (@jyuko49) 2020年5月17日
エフェクトに連動してカメラ背景を切り替え、エフェクトに追加したライトが平面に映るようにしています。
平面にはオブジェクトの影も映ります。
まとめ
AR Foundationで作成したプロジェクトをURPに対応させて、影を落とす、ライトを反映させる、カメラ背景を変更する、エフェクトを使うといった基本的な実装を試してみました。
実装方法は異なるものの、今までできていたことができないということはなさそうです。
パフォーマンス面の効果は比較できていないですが、今後はURPがUnityの標準になるということもあり、早めに切り替えて実装に慣れておいた方がよさそうです。