どうも蒼水です。
今回はShaderとDecalの関係性と自作シェーダーへの対応方法について説明していきます。
前回の記事はこちらからどうぞ。
atelier-aomi.hatenablog.com
実行環境:Unity6(6000.1.17f1)
今回の目的

今回はURPで使用できるデカールとそれを自作シェーダーへも貼れるようにする実装方法について実際に実装して動作を確認しながら理解することを目的とします。
先日こちらの記事でDecal Projectorの使い方や今回の内容と関連する話もちょろっとだけ触れているのでよろしければこちらも併せてみて頂けるとよりデカールについての理解が深まると思います。
atelier-aomi.hatenablog.com
ShaderGraph製シェーダーでのデカールの実装
ShaderGraph製シェーダーについては特に何もしなくても問題なくデカールを貼ることができます。
内部的にデカールの処理を入れ込んでくれているようです。
自作シェーダ―でのデカールの実装
一方コードベースでの実装になる自作シェーダ―では自分でデカールに関する処理を記述する必要があるのでそれについて解説します。
今回はこれまで自分が作成してきたAomiToonへの実装をしていきます。
Decalに関するInclude / pragmaの追加
Decalに関する処理は以下のDBuffer.hlslという名前のファイルが用意されているのでこれを追記します。
またデカール用のそのDBuffer内で使用されるキーワードを_DBUFFER~を追加します。
#pragma multi_compile _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 // 追加 #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl" // 追加
Fragment ShaderへDecal処理の追加
ApplyDecalToBaseColor()関数を使用してカラーに対してデカールを貼り付ける処理を実装します。
ApplyDecalToBaseColor()関数以外にもデカールに関するものがDBuffer.hlslには実装されていますが、今回はこちらを使用します。
自分のシェーダーの場合はトゥーンシェーダーだったのでベースだけでなく1影、2影への実装が必要だったためそれらすべてにデカールを貼り付ける処理を実装してみました。
この関数へは入力構造体から受け取る位置情報(positionHCS)と各種カラー(rgbのみ)を渡せばOKです。
float4 ForwardFragment(Varyings IN) : SV_Target { // 省略 // Texture sampling float4 mainTex = SAMPLE_TEXTURE2D(_Main_Texture, sampler_Main_Texture, IN.uv); float4 firstShadowTex = SAMPLE_TEXTURE2D(_1stShadow_Texture, sampler_1stShadow_Texture, IN.uv); float4 secondShadowTex = SAMPLE_TEXTURE2D(_2ndShadow_Texture, sampler_2ndShadow_Texture, IN.uv); float4 specMask = SAMPLE_TEXTURE2D(_SpecularMask, sampler_SpecularMask, IN.uv); // Decal 処理 #if defined(_DBUFFER) ApplyDecalToBaseColor(IN.positionHCS, mainTex.rgb); ApplyDecalToBaseColor(IN.positionHCS, firstShadowTex.rgb); ApplyDecalToBaseColor(IN.positionHCS, secondShadowTex.rgb); #endif // 以下省略 }
この実装を行うことで自作のトゥーンシェーダーへ無事デカールが貼り付けできるようになりました。

今回は自分このシェーダーに対応しましたが、基本どんな自作シェーダ―でも上記実装を行えばデカールを貼り付けることが可能なシェーダーにすることが可能です。
Fragment Shaderの実装はその処理時点のカラーへの貼り付けなので処理タイミングによっては描画結果が変わってきますのでそこは注意ですね。
自分の場合はライティングや各種効果を適用する前に貼り付けることでそれらが乗るように実装しました。
仮に、最後の最後に処理した場合はそれらの処理が乗らないのでUnlitのようなデカール貼り付けになります。ここはまぁ目的次第かなと。
補足:DBufferって何?
DBufferとはDecal Bufferの略で、その名の通りデカール用に取ってるバッファになります。
キーワードで_DBUFFER_MRT1 ~3まであるわけですがそれぞれ含まれる情報が変わってきます。
- MTR1:通常色と発光色
- MTR2:通常色と発光色に加えて法線
- MTR3:通常色と発光色、法線に加えてメタリック値、スムースネス値、AO(アンビエントオクルージョン)値
上記のような内容になっており、処理が分かれているわけですね。
なおこのDBufferを使用するためにはDepthNormalsPassが必要になるそうなのでその実装はしておきましょう。
以前こちらの記事で各種パスの実装について解説していますので参考にしてください。
atelier-aomi.hatenablog.com
おわりに
自作シェーダ―へのデカール対応、思ったより簡単。
DBufferを用意してくれっているからそれ使ったらおしまい!
というかこの辺調べても全然出てこなくてちょっと困ったけど解決したので良かった。
Decalの公式リファレンスに載ってないし....。(たぶん)
誰かの救いになれば...。