Unityでライトのカリングマスクについてのメモ。URPのForward+レンダリングパスなど

カリングマスク unity BIRP 3Dゲームの作り方
※記事内に広告が含まれています。

バーチャル3Dクリエイター神部まゆみです(*^_^*)

この記事はunityでライトのカリングマスクについての記事です。

動かしたのはunity2022.3.22とunity6000.0.32です。

●PRスペース●
■PR■

現在、毎日割引アセットが変わる Unity Flash Deals セール(50~80%オフ)をやってるみたいです。

Unity Flash Dealsセール 最大80%オフ

欲しいアセットはこの機会に買っておくと良いかも。

〇まゆみマート|BOOTH

BOOTHでVRoidテクスチャやVRChat向けオブジェクトなどを販売しています。いいねしてくれると励みになります(*^-^*)

ライトにカリングマスクを設定すると、特定のレイヤーのオブジェクトだけ照らせる

これはunity2022.3.22、BIRPで動かしました。

ライトのカリングマスクを設定すると、チェックを入れたレイヤーだけ照らされるようにできます。

カリングマスクはカメラにもあって特定のレイヤーしか映らないようにできるけど、今回はライトについてだけ扱います。

↓ポイントライトのカリングマスクのところ、Humanレイヤーだけチェックを外しました。

カリングマスク unity BIRP

そうするとHumanレイヤーのオブジェクトにだけ光が当たらなくなる。

カリングマスク unity BIRP

↓こんな感じでレイヤーごとに照らすオブジェクトを操作できて便利。

特定のオブジェクトだけ照らしたい時に便利です。

【試行錯誤の記録】URPの場合はそのままだとカリングマスクが使えない?

ここは試行錯誤のメモなのですっ飛ばしてOKです。

結論から言うとunity6だとデフォルトのレンダリングパスがフォワード+になっており、フォワードに切り替えないとカリングマスクが使えないみたいでした。

下の見出しで解説しているのでそっちを見ればOKです。


しかしunity6000.0.32のURPプロジェクトで同じように使おうとしたらライトに警告が出てました。

unity urp カリングマスク

Culling Mask should be used to control which lights are cuiled per camera. If you want to exclude certain lights from affecting certain objects, use Rendering Layers on the Lights, and Rendering Layer Mask on the Mesh Renderer.

「Culling Mask」は、どのライトがカメラに対してカリングされるか(=描画されないか)を制御するためのものです。
特定のライトが特定のオブジェクトに影響を与えないようにしたい場合は、
ライトに「Rendering Layer(ライトレイヤー)」を設定し、Mesh Renderer側に「Rendering Layer Mask」を設定してください。

ChatGPTに聞いたところ、URPではレンダリングレイヤー(ライトレイヤー)を使わないといけないっぽい?

えーほんとに?

追記:これはレンダリングパスがフォワード+の場合かな?今回はカリングマスクを使いたいので読み飛ばしてOKです。

unity urp カリングマスク レイヤーマスク ライトレイヤー

✅ 解説すると:

URPでは、Culling Maskはカメラ用の設定です。
昔(BIRP)のように「ライトが照らす対象を制御」するためには使えません。

代わりに使うべきなのが:

ライトの設定項目意味
Rendering Layer(または Light Layer)ライトがどのレイヤーに影響するか
MeshRenderer の Rendering Layer Maskオブジェクトがどのレイヤーのライトを受けるか

✅ つまりこの警告は:

「カリングマスクで制御しようとしても意味ないよ!」
「Light Layer(Rendering Layer)を使いなさい!」

という URPからの親切なアドバイスです。


✅ 次にやるべきこと(まとめ)

  1. URPアセットで Forward+ を有効にする
     → UniversalRenderPipelineAsset > Rendering ModeForward+
  2. ポイントライトに Rendering Layer(例:Light Layer 1)を設定
  3. MeshRenderer側で Rendering Layer Mask に同じ Light Layer を設定

→ これでようやく「このライトはこのオブジェクトにだけ影響する」が実現できます!

実際にやってみる

レンダリングパスとかいうところにありましたが、既にForward+になってました。

ここでレンダリングレイヤーを追加したり名前を変えたりできるっぽいです。

unity urp カリングマスク ライトレイヤー

んーでもこれでライトとオブジェクトのレンダリングレイヤーやカリングマスクをいじってみたけどなんかうまく動かなかった(-_-;)

んー、BIRPではカリングマスク動いたから大人しくBIRP使うか…?

同様の悩みにぶち当たっている人のページ

URPで同じように詰まっている人は結構いるっぽいですね…。

Unity Issue Tracker – [URP] Forward+ Rendering Path を使用すると、ライトカリングマスクが機能しない

[URP] オブジェクト毎に異なるディレクショナルライトを当てたい

シェーダーグラフとかいじる方法もあるっぽいけど、私はまだ知識がないのでちょっときついですね…。

ChatGPTに相談したら「BIRPか前のバージョンを使いなさい!」と言われたから大人しくそうします(-_-;)

URP カリングマスク レイヤーマスク 動作しない
URP カリングマスク レイヤーマスク 動作しない

unity6はまだ出て日が浅いから不安定なのかな?結構仕様も変わってるっぽいしなあ(^_^;)

VRChatで使い慣れてる2022.3.22でやってみます。

unity6000.0.32ではカリングマスクがうまく動作しなかったけど、2022.3.22でやったらいけた

2022.3.22だと正常にURPでカリングマスクが使えたため、バージョンの問題かな?

ちゃんとレイヤー切り替えでライトが照らされるオブジェクトを制御できました。

ん?まさかレンダリングパスがフォワードになってるから正常に動作したのかも?

なんかそんなことが書いてありますね。「カリングマスクはフォワードレンダリングでしか動かないぞ!」って。

URP カリングマスク レイヤーマスク 動作しない

Calling Mask only works with Forward rendering. Instead, use Rendering Layers on the Light, and Rendering Layer Mask on the Mesh Renderer, which will work across Deferred, Forward, and Forward+ rendering.

カリングマスクの呼び出しはフォワードレンダリングでのみ機能します。代わりに、ライトではレンダリングレイヤー、メッシュレンダラーではレンダリングレイヤーマスクを使用してください。これらは、ディファードレンダリング、フォワードレンダリング、フォワード+レンダリングで機能します。

えーマジかΣ(゚Д゚)これはURP初心者殺しか…。

そもそもURPいじってる人少ないのか、検索してもあんま情報出ないっすね…(-_-;)

日本のunityユーザーって大半がVRChat系のイメージがあるけど、VRChatはURPに対応してないからBIRPの情報が多いですね。

レンダリングパスをフォワードにしたらURPでもカリングマスク動いた

どうやらunity6000.0.32だとフォワード+がデフォルトになってるっぽくて、unity2022.3.22で動いたのはデフォルトがフォワードだったからっぽい。

↓の手順でフォワード+をフォワードに変えて、

これで動作確認してみたらunity6000.0.32のURPでも普通にカリングマスク使えました。はーマジか。

ChatGPTに報告したら「記事にして発表しましょう!」とか言ってきたからこの構成で記事にしておくかな…w

URP カリングマスク レイヤーマスク 動作しない

分かりやすいからこのまま短く記事にしてみたw

あまり同じような記事は増やさない方がいいんだけど、まぁ分かりやすいからいいか(^_^;)

私も後で見返すので分かりやすいほうがシンプルで良いかも。

おわりに

とりあえずBIRPとURPでカリングマスク動かせたから良かった。

ちょっと詰まったけど、まぁ理解が深まったからいいかな(^_^;)

また何かあれば追記します(*^_^*)

タイトルとURLをコピーしました