Unityは透過的なオブジェクト深度データを取得します



Unity Gets Transparent Object Depth Data



Unityは透過的なオブジェクト深度データを取得します

私が最近取り組んでいるプロジェクトには、奇妙な要件がたくさんあります。団結の青写真に似た行動ツリープラグインも作成しました。実装方法についてお話しする時間があります。今日は透明なオブジェクトを1つにまとめて解決しました。深いデータの問題を取得できません。だからみんなと共有してください。

透明性と被写界深度

画面後処理技術の一種として、被写界深度効果は誰もがよく知っています。ここでは展開されていません。カメラに付属の深度データにアクセスすることで、ガウスぼかしで補間して、大口径での被写界深度効果をシミュレートすると便利です。 。ただし、先天性の単一性のため、付属の透明シェーダーは深度検出を実行しません。深度検出後に透過的に処理される2つのパスシェーダーは、モデル内の正しい深度でのみグラフィックをレンダリングできますが、カメラを正しく取得することはできません。情報を深める。この記事は、この問題に対処することを目的としています。



要求する

透明度の要件に応じて、一般的に2つのタイプがあります。1つはモデルの半透明効果であり、もう1つは透明チャンネルの画像/ビデオのアルファカット効果です。私の主な関心事は後者ですが、ちなみに前者は研究されています。個別に議論しましょう。

最初に効果を見てみましょう:



モデルの透明度セクション

通常の不透明なオブジェクトの深度マップ
画像
ユニティトランスペアレントシェーダーでレンダリングされたオブジェクトは半透明ですが、深度マップはありません
ユニティシェーダー、
私の方法を使用すると、深度マップを持つ透明なオブジェクトがあります
、

透明チャンネル画像/動画セクション付き

透明度画像付きの一般的な深度マップ
画像
私の方法を使用して、深度情報を含む一方的な情報を取得します
画像

半透明モデルの深さを取得するための具体的な実装方法

アイデアは実際には非常に単純です。誰もが考えていると思いますが、なぜ長い間解決策が見つからなかったのかわからないので、それでも書いて穴を埋めます。
透明なブレンド後のユニットの単一性ではオブジェクトの深度マップを取得できないため、モデルに2つのマテリアルを作成する方法を見つけることができます。一方は半透明の効果を担当し、もう一方は処理のみを担当します。モデルグリッドデータを転送します。表示する必要がないため、詳細なデータを取得できます。これは非常に簡単です。
コンクリートシェーダー:



Properties { } SubShader { Tags { 'RenderType'='Opaque' } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include 'UnityCG.cginc' struct appdata { float4 vertex : POSITION } struct v2f { float4 vertex : SV_POSITION } v2f vert (appdata v) { v2f o o.vertex = UnityObjectToClipPos(v.vertex) return o } fixed4 frag (v2f i) : SV_Target { discard return 0 } ENDCG } } Fallback 'Diffuse'

透明度の画像/ビデオ取得深度を使用した具体的な実装方法

この問題は2日間私を悩ませてきましたが、解決策は私が思っていたよりもはるかに簡単です。 3Dエンティティとしての平面も同じプロパティを持つ必要があると考える前に、上記の方法を使用した後、透明度はモデルのネットワークに影響を与えません。グリッドが変化するため、取得される深度情報は平面メッシュ全体に基づいているため、透明領域のモデルメッシュを切り取る方法があるかどうかを確認したいので、ユニティシェーダーで非常に優れたシェーダーを見つけました。資源。操作を行わずに操作を使用しても、通常どおり深度データを取得できるため、窒息しすぎます。
シェーダーディレクトリ:
はい、彼は団結雪のカットアウトシェーダーであり、犬の命を救ってくれます。

結論

とにかく、私はすべての人を助けたいと思っています、結局のところ、プロジェクトには機密でないコンテンツがいくつかあり、それからUnityブループリントプラグインのアイデアを書くためのブログがあります。残念ながら、秘密のせいで、あまり話せませんが、どうぞ!