2015-06-27 16 views
5

Sahnede birkaç nesnem var ve A nesnesinin y = 10 (en yüksek nesne) olduğunu belirtsem bile, TOP kamerasından alt nesneleri A nesnesinden görebilirsiniz. benim sahnemden bir görüntü. Çekme sırası nesnelerin konumunu derinlemesine etkiler mi? (resimler dahil)

enter image description here

Ve ancak bugün

Ben modeller sırası önemli çizmek ilginç özelliği bulunan, yanlış olabilir. İşte "ship1" çekme sırasını değiştirdiğim başka bir resim, dikkat: "ship1" yolumun körüklügüdür, eğer ship1.draw(); önce yaparsam, gemi kaybolur (dogru), ama ship1.draw(); nihayetinde yaparsam üst (yanlış).

enter image description here

video: Opengl Depth Problem video

  • Q1) çizim sırası her zaman önemli mi?
  • S2) Bunu nasıl düzeltirim, kamera pozisyonunu her değiştirdiğimde çizim düzenini değiştirmeliyim?

Düzenleme: Ben de sadece benim projeksiyon Matrix IT'S değil sorun emin olmak için, glm kütüphanesi ile Perspektif Projeksiyon dersimde karşılaştırdı. Her şey doğru.

Edit1: Ben git benim projem var: Arkanoid git repository (VS yüklü olan pencereler, proje herhangi bir bilgisayardan çalıştırmak için hazırdır)

Edit2

: Ben kullanım normaller veya doku istemezsin. Sadece köşe ve endeksler.

Edit3: sahnede her nesne aynı dosyadan (pay) köşeleri kullanıyorsa bir sorun var mı?

Edit4: Ayrıca Perspektif Projeksiyonu değerlerini de değiştirdim. Ben 0.0f yakın düzlem vardı, şimdi yakın 20.0f ve uzak = 500.0f, açı = 60º var. Ama hiçbir şey değişmez, görüş derinliği değil, ama yapar. =/

Edit5: İşte benim Vertex ve Fragment shader'larım.

Edit6: her zaman buradayım, buradayım bütün gün buradayım, bana bir şey sorun. Şu anda tüm projeyi sıfırdan yeniden yazıyorum. İyi işleyen iki küp var, biri diğerinin önünde. Zaten benim için mayın sınıfını ekledim: kamera, projeksiyonlar, gölgelendiriciler için işleyici. Nesneleri oluşturan ve çizen sınıfa taşıma.

// Vertex shader 

in vec4 in_Position; 
    out vec4 color; 
    uniform mat4 Model; 
    uniform mat4 View; 
    uniform mat4 Projection; 

    void main(void) 
    { 
     color = in_Position; 
     gl_Position = Projection * View * Model * in_Position; 
    } 

// Fragment shader 

     #version 330 core 
    in vec4 color; 
    out vec4 out_Color; 
    void main(void) 
    { 
     out_Color = color; 
    } 

Bazı kod: Sana sorunu başka bir yerde bulunduğu olmadığını görmek bağladığınız deposunu klonlamışlar

void setupOpenGL() { 
    std::cerr << "CONTEXT: OpenGL v" << glGetString(GL_VERSION) << std::endl; 
    glClearColor(0.1f, 0.1f, 0.1f, 1.0f); 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LEQUAL); 
    glDepthMask(GL_TRUE); 
    glDepthRange(0.0, 1.0); 
    glClearDepth(1.0); 
    glEnable(GL_CULL_FACE); 
    glCullFace(GL_BACK); 
    glFrontFace(GL_CCW); 
} 

    void display() 
{ 
    ++FrameCount; 
    glClearColor(0.1f, 0.1f, 0.1f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    renderScene(); 
    glutSwapBuffers(); 
} 
void renderScene() 
{ 
    wallNorth.draw(shader); 
    obstacle1.draw(shader); 
    wallEast.draw(shader); 
    wallWest.draw(shader); 
    ship1.draw(shader); 
    plane.draw(shader); 
} 
+2

Derinlik tamponunuz var mı? Derinlik testi etkin mi? –

+0

Evet. Her kareden önce bunu yapıyorum: 'GlClearColor (0.1f, 0.1f, 0.1f, 1.0f); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); Daha sonra, programın başında bir kez çalıştırıyorum: 'glEnable (GL_DEPTH_TEST); \t glDepthFunc (GL_LEQUAL); \t glDepthMask (GL_TRUE); \t glDepthRange (0.0, 1.0); \t glClearDepth (1.0); ' –

+1

Ve glutInitDisplayMode()' öğesine iletilen bayraklarda GLUT_DEPTH öğesini ekleyerek bir derinlik arabelleği istediniz? –

cevap

7

.En son versiyonda Object3D :: beraberlik fonksiyonu şuna benzer:

glBindVertexArray(this->vaoID); 

    glUseProgram(shader.getProgramID()); 
    glUniformMatrix4fv(this->currentshader.getUniformID_Model(), 1, GL_TRUE, this->currentMatrix.getMatrix()); // PPmat é matriz identidade 
    glDrawElements(GL_TRIANGLES, 40, GL_UNSIGNED_INT, (GLvoid*)0); 
    glBindVertexArray(0); 
    glUseProgram(0); 

    glClear(GL_DEPTH_BUFFER_BIT); <<< clears the current depth buffer. 

son satır çizilmiş sonraki nesne düzgün tıkalı olmadığından, yani çizilir her nesnenin sonra derinlik tampon temizler. Derinlik tamponunu sadece her karede bir kez temizlemelisiniz.

+1

Ayrıca, ikinci çizim sırasına göre (iki nesne aynı derinliğe sahip olduğunda) GL_LEQUAL yerine derinlik testi için "GL_LESS" kullanılmasını öneririm (aynı nesnenin aynı derinliğe sahip olması durumunda) – n0rd

+1

GL_LEQUAL, aynı yüzeyin birden fazla kez gölgelenmesi durumunda yararlı olabilir, örneğin, çıkartmaları veya çoklu aydınlatmayı geç. Ancak bu durumda, muhtemelen GL_LESS'i kullanmak iyi bir fikirdir. –

+2

@ n0rd Derinlik eşitse, çizim sırası her iki karşılaştırma işlevi için önemlidir. Bu sadece “GL_LESS” için, birincisi kazanır ve “GL_LEQUAL” için sonuncusu kazanır. –

İlgili konular