14

デフォルトでは、オブジェクトは前後に描かれているようです。2-D UI オブジェクトを描画していて、それを前後に作成したいと考えています。たとえば、最初に白い正方形を作成し、その上に少し小さい黒い正方形を作成して、白い境界線を持つ黒いペインを作成できます。 この投稿ではいくつかの議論があり、この順序を「Painter's Algorithm」として説明しましたが、最終的に彼らが示した例では、目的の効果を得るためにオブジェクトを逆の順序で単純にレンダリングしました。私は後ろから前に(最初のオブジェクトは後ろに、後続のオブジェクトは上に描画されます)レンダリングは何らかの変換(gOrtho?)によって達成できますか?

また、GLUT などのラッパー ライブラリを使用したソリューションには興味がないことも述べておきます。

また、Cocoa NSOpenGLView を使用する Mac でのデフォルトの動作は、Windows ではこの動作が得られないのに対し、後方に描画されるように見えることもわかりました。私が使用しているWindowsのセットアップコードは次のとおりです。

glViewport (0, 0, wd, ht);
glMatrixMode(GL_PROJECTION);           
glLoadIdentity();                      
glOrtho (0.0f, wd, ht, 0.0f, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);             
glLoadIdentity();                       
4

6 に答える 6

24

次の呼び出しは深度テストをオフにし、作成された順序でオブジェクトが描画されるようにします。これにより、実際にはオブジェクトが前に引き戻されます。

glDepthFunc(GL_NEVER);      // Ignore depth values (Z) to cause drawing bottom to top

これを呼び出さないでください:

glEnable (GL_DEPTH_TEST);   // Enables Depth Testing
于 2008-10-10T02:28:34.640 に答える
5

特定の質問については、OpenGL で深さの順序を指定する標準化された方法はありません。一部の実装では、通常は高速であるため、デフォルトで前後の深さの順序付けを行う場合がありますが、それは保証されていません (発見したように)。

しかし、それがあなたのシナリオでどのように役立つかはよくわかりません。白い正方形の前に黒い正方形を描画する場合、深度バッファリングが有効になっている限り、描画される順序に関係なく、黒い正方形が白い正方形の前に描画されます。それらが実際に同一平面上にある場合、どちらも実際には他の前にあるわけではなく、深さの並べ替えアルゴリズムは予測できません。

リンクを投稿したチュートリアルでは、透明度を使用している場合に深さの並べ替えが関連するため、それについてのみ話しました。しかし、それがあなたが求めていることのようには思えません。

しかし、本当にそのようにしなければならない場合は、自分で行う必要があります。最初に白い正方形をレンダリング パイプラインに送信し、レンダリングを強制してから、黒い正方形を送信します。そのようにして深度バッファリングを無効にすると、正方形は同一平面上にある可能性があり、黒い正方形が白い正方形の上に描画されることが保証されます。

于 2008-10-09T01:40:28.293 に答える
2

描く順番が難しい。簡単な解決策はありません。ペインターのアルゴリズム (カメラの視点からの距離でオブジェクトを並べ替える) は最も単純ですが、お気づきのように、すべてのケースを解決できるわけではありません。

ペインターのアルゴリズムとレイヤーの組み合わせをお勧めします。プログラムの特定の要素のレイヤーを構築します。これで、背景レイヤー、オブジェクト レイヤー、特殊効果レイヤー、GUI レイヤーができました。

各レイヤーのアイテムで画家のアルゴリズムを使用します。一部の特別なレイヤー (GUI レイヤーなど) では、ペインタのアルゴリズムではなく、呼び出し順序で並べ替えます。最初にその白い正方形を呼び出して、最初に描画されるようにします。

于 2008-10-09T01:04:23.780 に答える
2

奥に入れたいものは、手前にしたいものより少し後ろに描きます。つまり、実際に z 値を変更します (z がスクリーン平面に対して垂直であると仮定します)。アイテムを互いの前に描画するために、多くの変更を行う必要はありません。また、z 値をわずかに変更するだけであれば、目的の位置からのずれはほとんど感じないはずです。あなたは本当に凝って、変更されたz位置に基づいて正しいx、y位置を計算することさえできるので、アイテムが本来あるべき場所に表示されます。

于 2008-10-09T01:08:39.230 に答える
1

内容は、glBegin/glEnd 関数を呼び出す正確な順序で描画されます。z バッファを使用して深度バッファリングを取得できます。2 次元オブジェクトの z 値が異なる場合は、その方法で必要な効果を得ることができます。Mac で説明した動作が見られる唯一の方法は、プログラムが手動でバックツーフロントの順序で描画している場合、またはこれを達成するために z-buffer を使用している場合です。それ以外の場合、OpenGLには、説明したように自動的に機能がありません。

于 2008-10-10T02:40:12.963 に答える
0

AlanKley が指摘したように、これを行う方法は深度バッファを無効にすることです。ペインターのアルゴリズムは、実際には、z バッファーのようなものがない場合にポリゴンを正しい順序でレンダリングするために使用される 2D スキャン変換手法です。ただし、3D ポリゴンには適用しません。通常、それらを変換して投影し (他のポリゴンとの交点を処理します)、2D 投影ポリゴンの結果のリストを投影された z 座標で並べ替え、逆の z オーダーで描画します。

Z バッファを使用できない (または使用したくない) 場合に、隠面を削除するための代替手法として、画家のアルゴリズムを常に考えてきました。

于 2008-10-10T02:38:24.120 に答える