openGL では、アイテムを前後に描画するにはどうすればよいでしょうか?

StackOverflow https://stackoverflow.com/questions/185536

  •  06-07-2019
  •  | 
  •  

質問

デフォルトでは、オブジェクトは前から後ろに描画されるようです。2-D UI オブジェクトを描画していて、それを後ろから前へ作成したいと考えています。たとえば、最初に白い正方形を作成し、その上に少し小さい黒い正方形を作成して、白い境界線のある黒いペインを作成できます。 この郵便受け これについては議論があり、この順序を「ペインターのアルゴリズム」と説明しましたが、最終的には、彼らが示した例では、目的の効果を得るためにオブジェクトを逆の順序でレンダリングしただけでした。後ろから前へ(最初のオブジェクトが後ろに行き、後続のオブジェクトが上に描画される)レンダリングは、何らかの変換(gOrtho?)を介して実現できると思いますか?

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

また、Mac では Cocoa NSOpenGLView を使用するとデフォルトの動作が後ろから前に描画されるように見えるのに対し、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();                       
役に立ちましたか?

解決

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

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

これを呼び出さないようにしてください:

glEnable (GL_DEPTH_TEST);   // Enables Depth Testing

他のヒント

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

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

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

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

描画順序は難しいです。簡単な解決策はありません。画家のアルゴリズム(カメラのビューに対する距離でオブジェクトを並べ替える)は最も簡単ですが、発見したように、すべてのケースを解決できるわけではありません。

画家のアルゴリズムとレイヤーの組み合わせをお勧めします。プログラム上の特定の要素のレイヤーを構築します。バックグラウンドレイヤー、オブジェクトレイヤー、特殊効果レイヤー、GUIレイヤーがあります。

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

前面に配置するアイテムの少し後ろに、背面に配置するアイテムを描画します。つまり、実際にz値を変更します(zがスクリーンプレーンに垂直であると仮定)。アイテムを互いの前に描画するために大きく変更する必要はありません。また、z値をわずかに変更するだけであれば、目的の位置からのオフセットにあまり気付かないはずです。本当に凝っていて、変更されたz位置に基づいて正しいx、y位置を計算することもできます。これにより、アイテムが本来あるべき場所に表示されます。

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

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

私はペインターのアルゴリズムを、Z バッファーを使用できない (または使用したくない) 場合の隠面除去の代替テクニックとして常に考えてきました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top