2016-04-14 19 views
1

Bu yüzden bir 3B OpenGL uygulamasına sahibim ve bir 2D HUD görüntülemek istedim, bir çok ziyaretten sonra bunu nasıl yapacağımın temel kavramını anlıyorum ama denediğim hiçbir şey görünmüyor. diğer birçok örnekler üzerinden gidiyor sonra benim geçerli kod şudur:OpenGL 2D HUD gösterilmiyor

// 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); 

Şu anda hiçbir şey görsel değişiklikler, bir renge temizlemek için ama o zaman bile ben üzerinde bir dörtlü çizmek gibi olamaz tüm ekranı alabilirsiniz .

DÜZENLEME:

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); 

DÜZENLEME 2: loca KOD

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

Görüntünüzün sol üst köşesinde yalnızca 5 piksel çiziyorsunuz, üssünüzün diğer 3/4'ü ise boşluğun dışında. – derhass

+0

@derhass Belki sadece aptalım ama izlemiyorum, köşe değerlerini değiştirdim ama hala hiçbir şey görmüyorum. – thesyncer

+0

Neye göre değiştirildi? – derhass

cevap

3

Ben HEIGHT ve WIDTH ayarlanır emin değilim yüzden sadece ikisi için 100 kullanılır. Gönderdiğiniz kodu çalıştırdığımda, ekranın sol üst köşesinde dörtlüyü görebiliyorum.

Neler olmasını öneririm, neler olup bittiğini anlayana kadar sadece HUD kodunuzu almaktır.

default view matrix

:

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(); 

GL devletin kalanı değişmez göz önüne alındığında, bu merkezde konumlandırılan ekranın% 50 doldurur beyaz dörtlü, çizmek gerekir: Örneğin

Bunun nedeni, görünümün şu şekilde görünen bir glOrtho çağrısı olmasıdır:

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

Şimdi WIDTH ve HEIGHT'u 10f'ye ayarlayalım. Bu sizin glOrtho çağrı ne olurdu:

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

Bu render alır budur:

modified view matrix

HEIGHT ve WIDTH büyüktür senin, 800x600 demek, o dört küçük olurdu o gitmeyeceklerini Görünmüyor bile.


DÜZENLEME: Düzenlemelerinizin ve yorumlar beni istediğini göstermektedir inanıyoruz bazı örnek kodlar ekleyelim okuduktan sonra model görünümü ve projeksiyon matrisleri

değişiklikler izole etmek glPushMatrix ve glPopMatrix kullanma.

:

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(); 

Bu

aşağıdaki vermektedir: önce Size sorunları ne neden olan edilebilir derinlik tamponu ile uğraşmaz, ama ben ne vardı üzerinde basit tutmak ve inşa etmek istediği interface over tetrahedron

Sen fark edeceksiniz biz ne zaman kurulumumuzda görünümü kesik konisi tanımlamak için bu kullandığınız 2d arayüzü için ModelView matris:

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

Bu, görüş alanımızı sol üstte 0,0, sağ altta ise 1,1 olarak tanımlar. Bu, görüntüyü boyutlara uymadan ekrana yerleştirmemizi sağlar. 2d ara yüzümüzü çizdiğimizde, sadece 0.0 ile 1.0 arasında bir değer sağlamak zorundayız ve bu görüntüyü görüntü alanına sığdırır. Önemli

: Hep hatırlamalıyız o model görünümü ve projeksiyon matrisler yığınlarının bulunmaktadır. Onlara herhangi bir değişiklik yapmadan önce, yığında yeni bir katmana bastığınızı ve işiniz bittiğinde geri göndermeyi unutmayın. Bunu yaparak değişikliklerinizi yalıtabilirsiniz.

+0

Derinlik yanıtı için teşekkürler, bazı noktaları daha iyi anlamama yardımcı oldunuz. Yine de sorunlarım var, kodumu bir düzenlemede değiştirdim, sahnede z konumunu konumlandırırsam bir dörtlü çizildiğini görebildim, 3D nesnelerini gizler ama yine de Quad kendini görüyor. Gökyüzü kodumun belki de derinlik sorunlarına yol açtığını düşünüyorum. – thesyncer

+0

Gördüğünüz şeyin ekran görüntüsünü kaydeder misiniz? Bu biraz daha anlamama yardımcı olabilir. Skybox'ım ile – Exide

+0

http://i.imgur.com/XaNWM24.jpg. açıklanır Skybox ile http://i.imgur.com/Xm8WbH5.png döndürülmüş bakış açısı, bu sahnenin merkezinden geçen bir düz dört var. – thesyncer