概要
URPで作成したシーンに、メッシュに穴を開けずに描画する方法を説明します。
頂点データをいじらなくて済むので、穴自体の移動が簡単に行えます。
プロジェクトのソースコードはこちら
https://github.com/Arihide/unity-hole-stencil
解説
プロジェクト準備
プロジェクト作成後、Project Settings→Quality より Defaultを Performantにします。
最低限の構成から始めたいためです。
続いて以下の2種類の穴のモデルを用意します。
シーン設定
続いてシーンに上記モデルを配置します。ただの円柱に見えますが、HoleとHoleMaskが同じ位置に存在します。
その上に穴を開けたい平面をHoleモデルの置きます。今の所は未設定なので穴は平面に隠れています。
レイヤー設定
Holeモデルを再度選択し、インスペクタ右上からレイヤーを追加します。
Hole,HoleMaskに対してそれぞれレイヤーを追加します
Renderer Data設定
ProjectタブよりAssets/Settings/URP-Performant-Renderer.asset
を選択しインスペクタに表示します。
Render Objects(Experimental)を選択します。
次のように2つ追加し設定をします。すると穴が無事表示されるようになります。
(正しく表示されない場合、HoleMaskのY座標を上にずらしてみてください)
最後にここで設定したRender Objectsの値について簡単に説明します。
- 最初にHoleMaskレイヤーに対して追加の処理を行う
- Stencilにチェックを入れ、Value=1,ConpareFunction=Always,Pass=Replaceを設定
- これにより、「HoleMaskが描画される部分にStencil=1」を書き込む
- Stencilにチェックを入れ、Value=1,ConpareFunction=Always,Pass=Replaceを設定
- 次にHoleレイヤーに対して処理を行う
- Depthにチェックを入れAlwaysに変更する
- HoleはPlaneに隠れているため、Depth Testを通過せず描画されないのを避けるため
- Stencilにチェックを入れ、Value=1を設定
- HoleMaskがStencil=1に設定した部分だけHoleを描画したいため
- Depthにチェックを入れAlwaysに変更する
注意点
コライダーには影響しないため、穴に物体を落としたいなどは追加で処理の追加が必要になります。