事前準備
- Terrainの作成を行う
- FBX Exporter(公式)でTerrainをFBXに書き出す
- モデリングソフトなどで書きだしたTerrainのメッシュを反転させて、洞窟の天井を作る
(軽量化のためそれ以外のメッシュは消す)
- 洞窟の床用のTerrainを作成する
洞窟の入り口を作る
仕組みとしてはゲーム「Portal」の様に穴に見えるように描画してやろう!という話。
洞窟内用シェーダー
デフォルトのシェーダーやURPのLitシェーダーなどをコピーして
以下の設定を適切な場所に置く。
"Queue" = "Geometry"
みたいなコードがあればそれを置き換えつつその下あたりに。
"Queue"が"Geometry-300"である点に注意。
{
//~これより上に必要な処理があれば~//
SubShader
{
Tags { "Queue" = "Geometry-300" "RenderType" = "Opaque" }
Pass
{
// Tags { "LightMode" = "UniversalForward" } ←URPならこれつける
Stencil
{
Ref 1
Comp Always
Pass Replace
}
}
}
//~これより下に必要な処理があれば~//
}
洞窟穴用シェーダー
洞窟の穴になるシェーダー
これは置き換えとか挿入とかせずそのまま使う
"Queue"が"Geometry-200"である点に注意。
Shader "Custom/HoleMask"
{
SubShader
{
Tags { "Queue" = "Geometry-200" "RenderType" = "Opaque" }
Pass
{
ZWrite On
ColorMask 0
}
}
}
表面用シェーダー
こっちはTerrainシェーダーをコピーしてくる
やりかたは洞窟内シェーダーと同様。
"Queue"が"Geometry-100"である点に注意。
{
//~これより上に必要な処理があれば~//
SubShader
{
Tags { "Queue" = "Geometry-100" "RenderType" = "Opaque" }
Pass
{
// Tags { "LightMode" = "UniversalForward" } ←URPならこれつける
Stencil
{
Comp Equal
}
}
}
//~これより下に必要な処理があれば~//
}
使い方
- 反転Terrain、床用Terrain、洞窟内に配置するオブジェクトの三つを洞窟用シェーダーに変更
- 入口に穴用オブジェクトを配置、洞窟穴用シェーダーを使う
- Terrainに表面用シェーダーに変更
しくみ
- 洞窟を描画する
- マスクは描画せず、代わりにマスクの部分に洞窟を描画する
- Terrainを描画する。この時マスクは上書きしない
- 洞窟完成!
余談
力が足らず上手く動かなかったが、シェーダーを書かずともURP設定で同様のことができる。
おそらくTerrainのデフォルトの"Queue"が"Geometry-100"になっている為描画順でおかしくなるっぽい。
Terrainでなければ動くし、上手く動けばこっちの方が楽。