2016-04-14 26 views
1

3D OpenGLアプリケーションがあり、2D HUDを表示したかったので、多くのグーグルの後にこれを行う方法の基本的な考え方を理解していますが、試してみると何も表示されません。他の多くの例乗り越えた後に私の現在のコードはこれです:OpenGL 2D HUDが表示されない

// HUD /////////////////////////////////// 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0, (GLdouble)WIDTH, (GLdouble)HEIGHT, 0, -1, 1); 
    glDisable(GL_DEPTH_TEST); 
    glDisable(GL_CULL_FACE); 

    glColor3f(1, 1, 1); 
    glPushMatrix(); 
    glBegin(GL_QUADS); 
    glVertex3f(-5.0f, 5.0f, 0.0f); 
    glVertex3f(-5.0f, -5.0f, 0.0f); 
    glVertex3f(5.0f, -5.0f, 0.0f); 
    glVertex3f(5.0f, 5.0f, 0.0f); 
    glEnd(); 
    glPopMatrix(); 
    glEnable(GL_DEPTH_TEST); 
    glDepthMask(GL_TRUE); 

今は何も視覚的変化を、私は色にクリアするために、画面全体を取得することができますが、でも、私はそれにクワッドを描くように見えることはできません。

EDIT:

glDisable(GL_CULL_FACE); 
    glDisable(GL_DEPTH_TEST); 
    glDepthMask(GL_FALSE); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0, WIDTH, HEIGHT, 0, -1, 1); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glClear(GL_DEPTH_BUFFER_BIT); 

    glColor3f(1, 1, 1); 
    glPushMatrix(); 
    glBegin(GL_QUADS); 
    glVertex3f(-10.0f, 10.0f, 0.0f); 
    glVertex3f(-10.0f, -10.0f, 0.0f); 
    glVertex3f(10.0f, -10.0f, 0.0f); 
    glVertex3f(10.0f, 10.0f, 0.0f); 
    glEnd(); 
    glPopMatrix(); 

    glEnable(GL_CULL_FACE); 
    glEnable(GL_DEPTH_TEST); 
    glDepthMask(GL_TRUE); 

EDIT 2:スカイボックスCODE

glDisable(GL_CULL_FACE); 
    glDepthFunc(GL_LEQUAL); // Change depth function so depth test passes when values are equal to depth buffer's content 
    skyShader.Bind(); 
    view = glm::mat4(glm::mat3(camera.GetViewProjection())); // Remove any translation component of the view matrix 
    glUniformMatrix4fv(glGetUniformLocation(skyShader.getProg(), "view"), 1, GL_FALSE, glm::value_ptr(view)); 
    glUniformMatrix4fv(glGetUniformLocation(skyShader.getProg(), "projection"), 1, GL_FALSE, glm::value_ptr(projection)); 
    // SKYBOX CUBE ///////////////////////////////// 
    glBindVertexArray(skyboxVAO); 
    glActiveTexture(GL_TEXTURE0); 
    glUniform1i(glGetUniformLocation(skyShader.getProg(), "skybox"), 0); 
    glBindTexture(GL_TEXTURE_CUBE_MAP, skyboxTexture); 
    glDrawArrays(GL_TRIANGLES, 0, 36); 
    glBindVertexArray(0); 
    glDepthFunc(GL_LESS); // Set depth function back to default 
+1

イメージの左上隅にわずか5ピクセルしか描画していません。クワッドの残りの3/4は、錐台の外側にあります。 – derhass

+0

@derhassたぶん私はばかだと思うかもしれませんが、私はフォローしません。私は頂点の値を変更しましたが、まだ何も見えません。 – thesyncer

+0

何に変更しましたか? – derhass

答えて

3

私はので、私はちょうど両方のために100を使用するように設定されているものをHEIGHTWIDTHわかりません。投稿したコードを実行すると、画面の左上隅に四角が表示されます。

何が起こっているのかを把握するまでは、HUDコードを使用することをお勧めします。例えば

:あなたのGLの状態の残りの部分を考えると

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

glPushMatrix(); 
glBegin(GL_QUADS); 
glVertex3f(-0.5f, 0.5f, 0f); 
glVertex3f(-0.5f, -0.5f, 0f); 
glVertex3f(0.5f, -0.5f, 0f); 
glVertex3f(0.5f, 0.5f, 0f); 
glEnd(); 
glPopMatrix(); 

が中央に位置する画面の50%を満たす白のクワッドを、描くべきである、変更されていません:

default view matrix

ビューはデフォルトでglOrthoコールになります。

glOrtho(-1f, 1f, -1f, 1f, -1f, 1f); 

WIDTHHEIGHTを10fに設定しましょう。これはあなたのglOrthoコールがどうなるかです:

glOrtho(0f, 10f, 10f, 0f, -1f, 1f); 

これは、レンダリングされるものです:

modified view matrix

あなたHEIGHTWIDTHが大きい場合、800×600の言う、そのクワッドはそれがwouldnとても小さいだろう出現することさえありません。


EDIT:編集内容と私はあなたが欲しいものを示していると考えているいくつかのサンプルコードを追加してみましょうコメントを読んだ後、モデル・ビューおよび投影行列

に変更を隔離するglPushMatrixglPopMatrixを使用しました。それはあなたの問題を引き起こしているものかもしれデプスバッファ、を扱っていないが、私はそれをシンプルに保つと私は前に持っていたものの上に構築したかった:

int width = 500; // window width 
int height = 500; // window height 

// define our GL viewport 
glViewport(0, 0, width, height); 

// setup 3d projection 
glMatrixMode(GL_PROJECTION); 
glPushMatrix(); 
glLoadIdentity(); 
glPerspective(60f, width/height, 1f, 50f); 

// setup 3d modelview 
glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 
glLoadIdentity(); 

// move the camera to put the tetrahedron behind the UI element 
glRotatef(135f, 0f, 0f, 1f); 
glTranslatef(0f, 5f, -30f); 

// draw 3d object (tetrahedron) 
glBegin(GL_TRIANGLES); 
// triangle 1 
glColor3f(1f, 0f, 0f);   // red 
glVertex3f(0f, 10f, 0f);  // a 
glColor3f(1f, 1f, 0f);   // yellow 
glVertex3f(0f, -10f, -10f);  // b 
glColor3f(0f, 1f, 0f);   // green 
glVertex3f(-10f, -10f, 10f); // c 
// triangle 2 
glColor3f(1f, 0f, 0f);   // red 
glVertex3f(0f, 10f, 0f);  // a 
glColor3f(1f, 0f, 1f);   // purple 
glVertex3f(10f, -10f, 10f);  // d 
glColor3f(1f, 1f, 0f);   // yellow 
glVertex3f(0f, -10f, -10f);  // b 
// triangle 3 
glColor3f(1f, 0f, 0f);   // red 
glVertex3f(0f, 10f, 0f);  // a 
glColor3f(0f, 1f, 0f);   // green 
glVertex3f(-10f, -10f, 10f); // c 
glColor3f(1f, 0f, 1f);   // purple 
glVertex3f(10f, -10f, 10f);  // d 
// triangle 4 
glColor3f(1f, 1f, 0f);   // yellow 
glVertex3f(0f, -10f, -10f);  // b 
glColor3f(1f, 0f, 1f);   // purple 
glVertex3f(10f, -10f, 10f);  // d 
glColor3f(0f, 1f, 0f);   // green 
glVertex3f(-10f, -10f, 10f); // c 
glEnd(); 

// revert to original modelview matrix 
glPopMatrix(); 
// revert to original projection matrix 
glMatrixMode(GL_PROJECTION); 
glPopMatrix(); 

// setup 2d projection 
glMatrixMode(GL_PROJECTION); 
glPushMatrix(); 
glLoadIdentity(); 
glOrtho(0f, 1f, 1f, 0f, -1f, 1f); 

// setup 2d modelview 
glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 
glLoadIdentity(); 

// draw the 2d interface 
glBegin(GL_QUADS); 
glColor3f(0.5f, 0.5f, 0.5f); // grey 
glVertex3f(0.05f, 0.05f, 0f); // top-left 
glVertex3f(0.95f, 0.05f, 0f); // top-right 
glVertex3f(0.95f, 0.2f, 0f); // bottom-right 
glVertex3f(0.05f, 0.2f, 0f); // bottom-left 
glEnd(); 

// revert to original modelview matrix 
glPopMatrix(); 
// revert to original projection matrix 
glMatrixMode(GL_PROJECTION); 
glPopMatrix(); 

これは、次のレンダリング:

interface over tetrahedron

我々はビューの錐台を定義し、これを使用している2Dインタフェースのためのときに我々は、セットアップModelView行列あなたは気づくでしょう:

glOrtho(0f, 1f, 1f, 0f, -1f, 1f); 

これは、ビュースペースを左上が0,0、右下が1,1であると定義します。これにより、ビューポートの大きさに関わらず画面上に物を配置することができます。 2Dインターフェイスを描画するときは、0.0〜1.0の範囲で値を指定するだけで、ビューポートにフィットします。

重要: あなたは、常にモデル・ビューおよび投影行列がスタックあることを覚えておいてください。それらを変更する前に、新しいレイヤーをスタックにプッシュし、完了したらそれをポップすることを忘れないでください。これを行うと、変更を隔離することができます。

+0

深い回答をいただき、ありがとうございました。私はまだ問題を抱えていますが、私は編集で自分のコードを変更しました。私はシーンにzポジションを置くとクワッドが描画されているのを確認できました。それは自分自身の四分の一を参照してください。私はスカイボックスのコードがおそらく深さの問題を引き起こしていると思う、私もそれを編集しました。 – thesyncer

+0

あなたが見ているもののスクリーンショットを投稿できますか?それは私がもう少し理解するのを助けるかもしれません。 – Exide

+0

http://i.imgur.com/XaNWM24.jpgに私のskyboxを載せてください。 http://i.imgur.com/Xm8WbH5.png skyboxと回転したパースペクティブはコメントアウトされていますが、これはシーンの中央を通る平坦なクワッドです。 – thesyncer

関連する問題