3

次のような単純なクワッドを描きたいとしましょう。

glBegin(GL_QUADS);
glVertex2f(-1.0,-1.0);
glVertex2f(1.0,-1.0);
glVertex2f(1.0, 1.0);
glVertex2f(-1.0, 1.0);
glEnd();

これをすべての 3D オブジェクトの背後に表示され、画面全体に表示されるように描画する方法はありますか? 私のカメラはマウスと共に動くので、このクワッドもカメラの動きに合わせて静止しているように見えなければなりません。目的はシンプルな背景を作ることです。

目の位置/回転に基づいてクレイジーな変換を行う必要がありますか、それとも glMatrixMode() を使用するより簡単な方法はありますか?

4

3 に答える 3

5

あなたがやりたいことは、単純なゲームで 2D HUD を描画するときや、永続的な背景だけを描画するときと似ているように思えます。私は専門家ではありませんが、比較的最近それを行いました。やりたいことは、投影行列を正射投影に変更し、クワッドをレンダリングしてから、以前の投影に戻すことです。これはマトリックス スタックで行うことができ、どのカメラからも完全に独立しています。

だから、最初に:

glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
int w = glutGet(GLUT_WINDOW_WIDTH);
int h = glutGet(GLUT_WINDOW_HEIGHT);
gluOrtho2D(0, w, h, 0);

これにより、新しい射影行列が射影スタックにプッシュされます (このプロジェクトでは glut を使用していましたが、通常の OpenGL に変換する必要があります)。次に、ウィンドウの幅と高さを取得し、gluOrtho2D を使用して正投影を設定します。

次:

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
// Draw your quad here in screen coordinates

ここでは、新しいきれいなマトリックスをモデル ビューにプッシュするだけです。これを行う必要がない場合があります。

最後に:

glPopMatrix() // Pops the matrix that we used to draw the quad
glMatrixMode(GL_PROJECTION);
glPopMatrix(); // Pops our orthographic projection matrix, which restores the old one
glMatrixMode(GL_MODELVIEW); // Puts us back into GL_MODELVIEW since this is probably what you want

これが役立つことを願っています。おわかりのように、目の位置を使用する必要はありません。これは主に、ウィンドウに完全に適合する新しい正投影を使用する場合、これは無関係であるためです。ただし、これが他の描画呼び出しの後に実行される場合、クワッドが後ろに配置されない場合があります。

編集:Boojumが示唆するように、深度テストをオフにして深度バッファをクリアすることも役立ちます.

于 2009-01-22T08:09:58.270 に答える
3

各フレームに使用する手順は次のとおりです。

  1. で深度バッファをクリアしますglClear(GL_DEPTH_BUFFER_BIT);
  2. 深度テストを無効にするglDisable(GL_DEPTH_TEST);
  3. で固定正射図法を読み込むgluOrtho2D(-1.0, 1.0, -1.0, 1.0);
  4. 説明したとおりにクワッドを描きます。
  5. 深度テストをオンに戻します。
  6. 通常の透視投影を読み込み、残りのビューを描画します。
于 2009-01-22T08:04:08.110 に答える
0

バックグラウンドに置くだけではいけません。すべてのオブジェクトの背後に配置するには、最初に描画する必要があります。

于 2009-01-22T07:46:28.287 に答える