すべてのジオメトリを「カット」するシェーダー


10

どのようにすれば、Unityでクリアな背景のみをレンダリングし、すべてのジオメトリを「カット」するシェーダーを作成できますか?例:

ここに画像の説明を入力してください

それは巨大な白い箱形の部屋のプリズムです。プリズムの表面は、シーンのスカイボックス(星空)をレンダリングしているだけです。私は複数のカメラを使用しましたが、これはかなり非効率的です...シェーダーだけの方法があるはずです。

これどうやってするの?

回答:


14

わかりました、ようやくそれを理解しました!

ここに画像の説明を入力してください

球体メッシュがシリンダーを通り、スカイボックスに至るまでどのように「カット」されるかがわかります。予想よりも時間がかかりましたが、wikiページ(http://wiki.unity3d.com/index.php/DepthMask)のおかげで、すべてを並べ替えることができました。

wikiページでシェーダー設定を使用する前に、同じ結果を達成するために、クリア/深度フラグが異なる3つの異なるカメラを使用していました。うまくいきましたが、奥谷に詰まりました。上記のソリューションは、1台のカメラのみを必要とし、はるかに高速に実行されます。

だからこんなシーンで…

  1. リアルなスカイボックスを追加(nasa)

  2. いくつかの形状を追加しました

  3. SetRenderQueueスクリプトを平面、球、円柱に追加しました

  4. 球のキュー順序を2999に設定します(他のオブジェクトは3000にあります)

  5. 次に、DepthMaskシェーダーを球に追加しました

それでおしまい。質問があれば教えてください!


2
ドー、私は上記の投稿で問題を完全に考えすぎていました(私は本当に壁/床のフラットホールメッシュについて考えていました)。リンクされたソリューションは3D穴オブジェクトを示し、この場合、表示されるソリューションは非常に単純です。実際に必要なのは、色を書き込まずに「穴」をZバッファーに書き込み、穴が早く描かれた。
bluescrn 14

@bluescrnご心配なく!詳細な投稿に感謝します。:)
CalebHC 2014

2

必要な効果を得るには、いくつかのオプションがありますが、コストはかかります。

  • 穴をステンシルバッファーまたは宛先アルファチャネルに書き込んでから、スカイボックスを最後に描画します。適切なステンシルテストまたはアルファブレンドを使用し、Zテストはありませんか?

または

  • フレームの開始時にスカイボックスをテクスチャにレンダリングし、それを「穴のジオメトリ」に投影します

Zバッファを使用/乱用することでこれを行う方法も必要だと思いますが、実際のZを使用して「ホールポリゴン」をZテストしてから、別のZを作成する必要があります。複数のパスとステンシルバッファー-このように設定されたrenderstateで穴を3回描画すると、うまくいく場合があります。

  • パス1:z検定なし、穴ポリの下のステンシルをクリア
  • パス2:通常のz検定、ステンシル値の増分(深度テストが合格する場所)
  • パス3:ステンシル> 0のZをクリア

ただし、特定の順序で描画する必要があります。最初に環境、次に穴、最後にスカイボックスです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.