0

私は拡張現実アプリケーションに取り組んでおり、3 つの異なる種類のジオメトリのレンダリングを並べ替える必要があります。

レベル 1
バックグラウンド ジオメトリ。これは、基本的なアーキテクチャを表す一連の三角形です。壁など

レベル 2
写真飛行機。空間の平面にテクスチャとして配置された建築の写真。その平面は幾何学的にレベル 1 の前にあります (仮想カメラから見て)

レベル 3
動的ジオメトリ。これらは、シーンを拡張するためのボックスなどのプリミティブです。これらはレベル 1 の座標系内に正しく配置されているため、幾何学的にレベル 2 の後ろにあります。

望ましい効果:
a) Level_2 を常に Level_1 の前に描画したい これは、イメージ プレーンをカメラの近くに配置することで自動的に実現されます。

b) Level_1 に対して Level_3 を正しくオクルードして、Level_1 の壁の後ろに部分的に配置されている場合、ダイナミック ボックスの一部を隠したい。これは、通常のパイプラインでも自動的に発生します。デプステストなど

c) Level_3 のすべての Fragments/Pixel を、実際には Level_2 の背後にある場合でも、Level_2 の上に描画したいと考えています。この効果により、オブジェクトが写真の一部に遮られているように見えるはずです。

「sortkey」属性を介してこの効果を達成できるX3Dom(webglにレンダリングされる)にアプリケーションがあるため、これが可能であることを知っています。しかし、純粋な OpenGL では同じ効果を再現できませんでした。Stencilbuffer または Z-Buffer トリックの単純な使用法であると考えましたが、機能しません。Level_3 ジオメトリに「常にパス」を与えるにはどうすればよいですか? または、Level_2 が Level_1 のみを非表示にし、Level_3 が両方の前にある場合でも、Level_3 を非表示にするにはどうすればよいですか?

基本的に:
1) Level_2 は Level_1 を隠します
2) Level_1 と Level_3 は互いに遮ります
3) Level_3 の可視部分 (Level_1 に対して) は Level_2 によって遮られません

何か助けはありますか?

ありがとう!

4

2 に答える 2

0

しばらくして気づきましたが、ここで更新するのを忘れていました。解決策は予想通り簡単でした。DepthTesting は常にアクティブなままです。レンダリングは、1、2、3 の順に呼び出されます。レベル 2 のレンダリングは、

gl.glDepthMask(偽);

gl.glDepthMask(真);

すべてのレベルの正しい深度レンダリングとオクルージョンを可能にしますが、レベル 2 要素のレンダリングから深度バッファーを変更しません。したがって、レベル 3 要素はレベル 2 の深さを無視し、レベル 1 に対してクリップします。

于 2014-05-26T18:44:26.423 に答える
0

説明したレベルに応じて、シーンを 3 段階でレンダリングする必要があります。深度テストを有効にして、最初に level_1 をレンダリングする必要があります。次に、深度テストを無効にして level_2 をレンダリングする必要があります。第 3 段階では、深度テストを有効にして level_3 をレンダリングする必要があります。したがって、level_2 のジオメトリは level_2 と完全にオーバーラップしてレンダリングされますが、Z バッファには影響しません。したがって、level_3 のジオメトリは、level_2 がまったくレンダリングされていないかのようにレンダリングされます。

深度テストを有効または無効にするには、glEnable および glDisable関数を呼び出す必要があります。glDisable(GL_DEPTH_TEST)を呼び出すと、深度テストと深度バッファの更新が無効になります。深度テストと深度バッファへの書き込みを有効にするには、glEnable(GL_DEPTH_TEST)を呼び出す必要があります。

実行する必要がある一般的な手順:

    /*
    Render level_1 
    */

    glDisable(GL_DEPTH_TEST); //disable depth test and update of the depth buffer

    /*
    Render level_2         
    */

    glEnable(GL_DEPTH_TEST);  //enable depth test and update of the depth buffer

    /*
    Render level_3         
    */
于 2014-05-14T21:03:11.690 に答える