1
アルファブレンドスプライトを通してシルエットを見るシェーダー
Unityで、これらの例のようなシースルー効果を達成したいと思います。 私の特定のシナリオには、いくつかの要件があります。 スプライトはアルファブレンディングを使用しており、スプライトには透明な領域があります。 キャラクターを遮る2種類の要素があります。1つはシルエット効果を作成し、もう1つは通常のように動作する必要があります。 シルエットを作成する要素を遮蔽するには、ZWriteを有効にし、そうでない要素では無効にします。 キャラクターについては、シェーダーのキューをtransparent + 1に設定して、このパスを追加しました。 Pass { ZTest Greater Lighting Off Color [_Color] } そして、効果は部分的に機能します: シルエットは、透明な部分も含めて、キャラクター全体に描かれます。透明な部分はシルエットを作成しないでください。 シルエットは、スプライトの一部が透明であっても、キャラクターがスプライトの背後にあるときに作成されます。スプライトの透明な部分の後ろにいると、シルエットが作成されません。 キャラクターは、要素の後ろにある場合でも、残りの要素の前に表示されます。これは、キューをTransparent + 1に設定しているためだと思います。ただし、透明のままにすると、キャラクターは正しい順序で描画されますが、シルエットは表示されません。 私は誰かが私に与えたこれらのヒントに従おうとしましたが、私はそれを機能させることができません: 1)スプライトをレンダリングするパスはそのままにします。 2)zバッファーに書き込むパスを追加しますが、clip()を使用してアルファに基づいてピクセルを破棄するシェーダーがあります。z-bufferを使用して、MSAAおよびalpha-toカバレッジを使用せずにソフトzテストを作成することはできません。その品質は素晴らしいものではありませんが、あなたができる最善の方法です。より高速な代替手段は、パターンまたはノイズディザーです。スプライトのエッジがかなり鋭い場合は、古き良きしきい値を使用します。 3)zテストを使用してオクルージョンカラーを描画するオクルード可能なオブジェクトに3番目のパスを追加し、最終パスとして描画されることを確認します。 私は、特にUnityのシェーダーに慣れていないので、適切に機能させる方法がわかりません。