2013-12-10 68 views
0

我使用OpenGL在屏幕上繪製一些內容。OpenGL深度無法正常工作

這裏的初始化:

glViewport(0, 0, width, height); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(0, width, height, 0, 10, -10); 
glMatrixMode(GL_MODELVIEW); 

然後我畫使用這個對象:

void draw(...) 
{ 
    glEnable(GL_TEXTURE_2D); 
    glEnable(GL_BLEND); 
    glBegin(GL_QUADS); //Begining the cube's drawing 
    { 
     glTexCoord3f(tu1, tv1, 1); glVertex3f(offset,  _y, _z); 
     glTexCoord3f(tu2, tv1, 1); glVertex3f(offset + w, _y, _z); 
     glTexCoord3f(tu2, tv2, 1); glVertex3f(offset + w, _y + h, _z); 
     glTexCoord3f(tu1, tv2, 1); glVertex3f(offset,  _y + h, _z); 
    } 
    glEnd();  
    glDisable(GL_BLEND); 
glDisable(GL_TEXTURE_2D); 
} 

但深度不尊重(有很多_z值的測試)。它隨呼叫順序而變化,最近的將是最後一次繪製。

如果我畫的粉紅色條第一:

enter image description here

如果我畫的精華帶後的粉紅色吧:

enter image description here

+0

您可以添加您的問題的屏幕截圖,因爲我似乎完全不瞭解您的問題。 – Vallentin

+0

@Vallentin完成:) –

回答

5

當您看到畫家的算法(最後一個對象繪製出現在前面)時,這意味着您的深度緩衝區有問題。在您的情況,您需要啓用深度測試和寫作,並在初始化(it's off by default):

glEnable(GL_DEPTH_TEST); 

您還需要在每一幀的開始清除深度緩存(清除顏色緩衝區通常是一個好主意爲好):

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

看一看什麼OpenGL的維基對此有什麼看法depth buffering

+0

現在,當我使用'glVertex3f(x,y,z);'與不同的x,y和相同的z時,只是第一個對象被繪製...任何想法? –

+0

對象是否重疊?默認情況下,只有當對象比當前z緩衝區值更靠近攝像機時纔會出現對象。你可以改變這種行爲,讓具有相同z值的對象​​使用'glDepthFunc(GL_LEQUAL)'覆蓋另一個對象。 – Trillian

+0

只是謝謝你。 –

-1

請記住下列項目可能幫助你: 1. OpenGL遵循右手規則。 2.如果您使用push和pops來處理矩陣,那麼您推送的最後一個是在渲染時應用的第一個。

+1

好友,你應該只發布回答!不是「這可能會在未來幫助你」。 – Vallentin