2

特定の空間内にある場合にのみ、特定のオブジェクトがレンダリングされるような効果を生み出したいと思います。秘密のオブジェクトが中にあるときにそれを明らかにする「魔法のデコーダーボリューム」を考えてみてください。

秘密のオブジェクトと明らかになるボリュームがすべて球であると仮定しましょう。最初に非秘密オブジェクトをレンダリングします。次に、表示ボリュームの背面を深度バッファーとステンシルバッファーにレンダリングします。デプステストとステンシルテストの両方に合格したシークレットオブジェクトのみをレンダリングすると、それらも表示ボリュームの前に描画されます。公開ボリュームの前に保持する2番目のデプスバッファを作成する機能が必要です。これを行うための標準的な方法はありますか?

おそらく、露出している球の中心を通過するように、近くのクリッピング平面を設定できると思います。次に、ニアクリッピングプレーンを目に近づけ、リビールボリュームの前面をレンダリングし、ファークリッピングプレーンをその中心に設定し、深度テストよりも大きいシークレットオブジェクトの頂点のみをレンダリングしてステンシルテストに合格することができます。 。

この2パスのアプローチは少し醜い感じがします。ボリューム内に秘密のオブジェクトの前にあるはずの非秘密のオブジェクトがある場合、逆の深度テストのために押しつぶされる可能性があります。シェーダーの経験はあまりありませんが、それが道だと思いますか?

4

1 に答える 1

1

シェーダーに関するVincentの削除された回答は、それほど悪い考えではありません。フラグメントごとに、露出している球の中心からの距離を計算します。距離が長すぎる場合はdiscard

それ以外の場合、シャドウボリュームは、追加のジオメトリを表示しないため、機能します。私がタイプするときに考えていますが、あなたにできることは次のとおりだと思います。

  • カラーバッファへの書き込みを無効にして、深度のみに影響を与えるようにします。
  • GL_LESS深度値を確立するために、標準の深度テストでシーンをレンダリングします。
  • 同じ深度テストを使用して、クリッピング球の後ろ向きの部分をレンダリングします。
  • クリッピング球の前面部分をGL_GREATER有効にしてレンダリングします。これにより、これらの面の一部は、物が前面にある場合にのみ描画されます。
  • カラーバッファを有効にし、深度機能に切り替えますGL_EQUAL;
  • シーンジオメトリを再度レンダリングします。

正味の効果は、最初の4つのステップの後、デプスバッファがクリッピングジオメトリと交差した場所でのみ真の値に等しい値を持つことです。したがって、色に切り替えるとGL_EQUAL、そのジオメトリのみが通過します。

具体的には、ステップ3でクリッピングジオメトリの背後にあるものをすべて消去し、ステップ4で前面にあるものをすべて消去します。暗黙の前提は、クリッピングジオメトリがビュー錐台内に完全に収まるということです。

于 2012-04-17T17:37:58.170 に答える