質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

3367閲覧

Unityで半透明なオブジェクトの後ろにあるオブジェクトを描画しないようにしたい

miey

総合スコア5

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2022/04/13 09:01

編集2022/04/14 10:28

開発環境

Unity 2019.4
Universal RP 7.6.0

実現したいこと

  • ある半透明なオブジェクトを設置し、その後ろにあるオブジェクトを描画しないようにしたい

試したこと

まず「Unity Universal RP における影のみの描画とレイヤーを用いた透過」という質問を発見し、こちらの質問中に出てくる透明マントが私の実装したいものと完全に一致していたので、上の質問者様が述べているのとできる限り同様にプロジェクトを構成しました。

半透明なオブジェクトが紫がかった"wall"、描画を消したいオブジェクトが赤色の"enemy"です。
イメージ説明

このとき、半透明のwallのオーバーライドは機能していることが確認できました。
しかし、override_wallマテリアルによるオーバーライドは重ね塗りのようになっており、このマテリアルを完全に透明にしても求める透過処理が得られません。

また、赤いenemyのオーバーライドはそもそも行われませんでした。
wallのオーバーライドを無効化してみてもダメでした。

実現したいことが可能となるような設定方法、アドバイス等あれば教えていただきたく思います。

追記

Bongo様からの回答を受けまして同様にしてみたところ、私の環境では改善されず以下のようになっております。
イメージ説明

一番上のFilteringについては、Opaque Layer Maskからwallを外し、Transparent Layer Maskからはenemyを外しております。

Bongo様の環境ではwallオブジェクトに影が付いていることが気になったのですが、マテリアルの設定の違いなどあるのでしょうか。
私の環境で紫半透明のマテリアルはこちらのようになっております。
イメージ説明

また、URPの導入はこちらの記事に基づき行い、その他の設定は特に行っておりません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

私の試してみたところですと、Renderer Dataの設定を...

  • Filteringのレイヤーマスクからenemyとwallを外す(これはすでにそのように設定済みかと思います)。
  • 1つ目のRender Objectsでwallを追加描画する。EventはAfterRenderingSkybox、Queueは不透明、Layer Maskはwallのみとし、OverridesのMaterialは紫色半透明のものをセットする。Depthをオン、Write Depthもオン、Depth TestはLessまたはデフォルトのLess Equalとする。
  • 2つ目のRender Objectsでenemyを追加描画する。EventはAfterRenderingSkybox、Queueは不透明、Layer Maskはenemyのみとし、Overridesは何も設定せず空のままにしておく。

という組み合わせにしたところ、下図のように描画されました。ご参考になりますでしょうか?

図

まずwall側を半透明マテリアルで描画しますが、このときデプス設定をオーバーライドして不透明オブジェクトと同様にデプステスト・デプス書き込みを行わせることで、後続のenemy描画時では重なった部分が描画されなくなるはずです。
enemy側はマテリアルのオーバーライドを行わず、キューブのレンダラーにセットされている赤色不透明マテリアルをそのまま使うことにしました。

投稿2022/04/13 22:25

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miey

2022/04/14 10:31

返信が遅くなり申し訳ありません。 また、回答いただきありがとうございます。 ご提示いただいた用に修正を行ったのですが、回答で貼られたgifのような結果は得られませんでした。 質問に私の環境等について追記をいたしましたので、可能でしたら一度ご確認いただけますでしょうか。
Bongo

2022/04/14 11:34

追記拝見いたしましたが、「一番上のFilteringについては、Opaque Layer Maskからwallを外し、Transparent Layer Maskからはenemyを外しております。」ということは、Opaque Layer Maskにenemyレイヤーが含まれているということでしょうか? おそらくそれではうまくいかないだろうと思います。今回のアプローチのキモは... - wallを描画するまでに背景となるものを描画しておく。enemyはwallの後ろに表示されてはならないので、ここまでの段階でenemyを描画してはいけない。 - スカイボックスまでの描画が終わった段階でwallを描画する。wallのマテリアルは半透明のものに差し替えられ、それまでに描画された映像の上に重ね描きされる。 - 最後にenemyを描画する。wall描画時にデプスを書き込んでいるので、enemyがwallの背後にある場合はデプステストに落ちて描画されない。 というところにあると言えるかと思います。ですので、Opaque Layer Maskからはwallだけでなくenemyも外してみてはいかがでしょうか。 wallオブジェクトが影を落としている件については、これはwallオブジェクトの差し替え前のマテリアルの設定に依存するはずです。 私の場合はwallオブジェクトの差し替え前マテリアル(wallのレンダラーにセットしてあるマテリアル)には一般的な不透明Litマテリアルを使用しましたので、シャドウマッピングに参加することができ影を落としたと言えるかと思います。 もし差し替え前マテリアルがTransparentであるとか、あるいはOpaqueでもwallオブジェクトのレンダラーの「Cast Shadows」をオフにしている場合はシャドウマッピングの際に無視されるので、影が消えるだろうと思います。 ご質問者さんの場合の差し替え前マテリアルはTransparentでしょうか?もしそうでしたら、さらに... - Renderer DataのTransparent Layer Maskからwallを外す。 - 1つ目のRender Objects(wall描画用のRender Objects)のQueueをTransparentにする。 といった調整を加える必要があるかもしれません。wallオブジェクトはRender Objectsだけによって描画するべきでしょうから、さらにその後のTransparentパスで再度描画されると困るのでTransparent Layer Maskから除外し、またRender ObjectsのQueueが不適切だとRender Objectsで描画されないようですからTransparentに切り替えるわけです。
miey

2022/04/14 12:27

お早い回答ありがとうございます。 目的が達成できましたのでベストアンサーとさせていただきました。 自分でURPの各種設定について理解しきれていませんでした。 理屈から丁寧に解説していただいて、非常にありがたかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問