UnityのURPでデカールを使ってオブジェクトにテクスチャを貼り付ける方法についてまとめました。
Unity2021.2.0f1
はじめに
Unity2021.2から、Universal Render Pipeline(URP)でデカールを使用できるようになりました。
本記事ではこのデカール機能の使い方をまとめます。
なおURPの基本的な知識については必要に応じて以下の記事を参照してください。
デカールの使い方
URPでデカールを使うにはまずUniversal Renderer DataのAdd Renderer FeatureボタンからDecalを追加します。

Max Draw Distanceはデカールする距離の最大値です。
Techniqueプロパティについては次節で説明します。
次にMaterialを作成し、Shader Graphs > Decalシェーダをアサインします。
Base Mapには投影したいテクスチャをアサインし、ノーマルマップを使いたい場合にはNormal MapやNormal Blendを設定します。
また同じマテリアルを使ったデカールを複数使う場合にはEnable GPU Instancingにチェックを入れるとパフォーマンスを向上できます。

次にGameObject > Rendering > URP Decal ProjectorからDecal Projectorを作成します。
これのMaterialプロパティに先程作ったマテリアルをアサインします。

あとは投影したい位置に移動すればデカールが貼り付けられます。
必要に応じてProjection Depthプロパティを調整してデカール対象とする深度を調整してください。
その他のプロパティについては細かく説明しませんが、触ってみれば簡単にわかると思います。
なおデカールは半透明なオブジェクトには使用できないのでご注意ください。
Decal Renderer FeatureのTechniqueについて
さて前節で設定したDecal Renderer FeatureのTechniqueプロパティは以下の選択肢を持ちます。
- Automatic
- DBuffer
- Screen Space
このうちAutomaticを選択すると、ビルドするプラットフォームに応じてDBufferかScreenSpaceのいずれかをUnityが自動的に選択してくれます。
DBufferを選択すると、デカールの情報はDBufferという一時テクスチャに書き込まれ、不透明描画の際に合成されます。
DBufferを選択すると出現するSurface Dataというオプションを切り替えることで、デカールのクオリティを変更できますが、
DBufferの数が上下しパフォーマンスに影響するので注意が必要です。
例えばSurface DataをAlbedo Normal MAOSにした状態でFrameDebuggerを見ると、三つのDBufferが生成されていることが確認できます。

なおDBufferはDepthNormalプリパスを使うためタイルベースレンダリングとは相性が悪いようです。
TechniqueをScreen Spaceにすると、深度テクスチャから再計算した法線を使ってデカールをレンダリングします。
Normal Blendプロパティで再計算された法線の精度を設定できます。
精度が高いほど深度テクスチャのサンプリング数が多く、すなわち処理負荷が大きくなります。
また、Use GBufferにチェックを入れると、Deferred Renderingを行う際にGBufferを使ったデカールを行います
