メッシュが非表示になっているときに/後処理メッシュのアウトラインを非表示にする方法
3Dエンジンでアクティブなアウトラインを設定する作業をしています。選択した3Dキャラクターのハイライト効果や画面の風景です。ステンシルバッファーを操作し、満足のいく結果が得られなかった後(凹面形状の問題、カメラからの距離が原因のアウトラインの厚さ、デスクトップとラップトップ間の不整合)、エッジ検出とフレームバッファーサンプリングに切り替えて、アウトラインを取得しましたかなり満足しています。 ただし、選択したメッシュが別のメッシュの背後にある場合、アウトラインを非表示にできません。これは、残りのシーンをレンダリングした後、フレームバッファーから2Dシェーダーアウトラインをレンダリングするだけなので、私のプロセスを考えると理にかなっています。 結果の2つの画面キャプチャーを以下に示します。1つ目は「良好な」アウトラインで、2つ目は、アウトラインソースをブロックするメッシュ上にアウトラインが表示される場所です。 レンダリングプロセスは次のように実行されます。1)ハイライトされたメッシュのアルファのみを描画し、フレームバッファー(framebuffer1)に黒いシルエットをキャプチャします。 2)テクスチャをframebuffer1からエッジ検出を実行する2番目のシェーダーに渡します。フレームバッファ2でエッジをキャプチャします。 3)シーン全体をレンダリングします。 4)シーンの上部にあるframebuffer2からテクスチャをレンダリングします。 私は達成する方法についていくつかのアイデアを持っているので、それらの有効性、またはより単純な、またはより良い方法についてフィードバックを得たいと思っています。 最初に、シーン全体をフレームバッファーにレンダリングし、強調表示されたメッシュの可視シルエットをアルファチャネルに格納することを考えました(強調表示されたメッシュが表示されているところはすべて白で保存されています)。次に、アルファチャネルでエッジ検出を実行し、シーンフレームバッファーをレンダリングしてから、エッジを上にレンダリングします。次のような結果になります: これを実現するために、ハイライトされたオブジェクトのレンダーパス中にのみ、定義を設定して、可視ピクセルのアルファをすべて黒くすることを考えました。 私の2番目のアイデアは、上で概説した現在のレンダリングプロセスを使用することですが、選択したメッシュのシルエットをレンダリングするときに、framebuffer1のR、G、BチャネルにもX、Y、Z座標を格納します。エッジ検出が実行され、framebuffer2に格納されますが、RGB / XYZ値をアルファのエッジからシルエットに渡します。次に、シーンをレンダリングするときに、座標がframebuffer2に格納されているエッジ内にあるかどうかをテストします。その場合は、現在のフラグメントの深度をテストして、RGBチャネルから抽出された座標(カメラ空間に変換)の前か後ろかを判断します。フラグメントが深度座標の前にある場合、フラグメントは正常にレンダリングされます。フラグメントが背後にある場合は、塗りつぶされたアウトラインカラーとしてレンダリングされます。 私はこのプロジェクトにLibGDXを使用しており、WebGLとOpenGL ESをサポートしたいので、ジオメトリシェーダーや新しいGLSL関数を使用するソリューションはありません。私の提案したアプローチについて誰かがコメントしたり、より良い提案をしたりできるとしたら、本当にありがたいです。