2017-02-06 72 views
0

我在寫代碼,顯示對象的隱藏部分。 這裏是例子:板是較大的多邊形物體,圓柱體是較小的多邊形物體。圓柱被盤子隱藏起來。 (參見下半部窗口:氣缸穿透板的汽缸的某些部分是由板隱藏。) 的圖像由下面碼。的OpenGL glDepthFunc不起作用

  1. 拉伸板(未它繪製到RGB緩衝器僅捕捉深度值。)
  2. 繪製氣缸(如果深度測試「少」穿過:這意味着所述氣缸(更小的深度的可見部分)被繪製)

該模型是沿着每個幀y軸旋轉。它給了我每一幀的正確結果。現在

,我想顯示在氣缸作爲透明的隱藏部分。 在使用混合之前,我只想顯示圓柱體的隱藏部分。也就是說,我必須顯示具有比板深度更大的深度值的柱面區域。然後,我只是改變

glDepthFunc(GL_LESS); 

glDepthFunc(GL_GREATER); 

但是,如果我把它改爲GL_GREATER,它並沒有給我一個正確的結果。 我在第一幀得到了正確的結果,但之後,模型消失了。 (這意味着,模型不顯示在窗口上,下視口) 我無法理解原因。幫我!

enter image description here

void MyDisplay() 
{ 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
    glRotatef(rot, 0, 1, 0); 

    glViewport(0,0, width, height/2); 
    glEnable(GL_DEPTH_TEST); 
    DrawPlate(); 
    glColor4f(0,0,0,1); 
    DrawCylinder(); 
    glDisable(GL_DEPTH_TEST); 

    glViewport(0,height/2, width, height/2); 
    glEnable(GL_DEPTH_TEST); 

    glClearDepth(1.0); 
    //glDrawBuffer(GL_NONE); // No color buffers are written 
    glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
    DrawPlate(); 

    glDepthFunc(GL_LESS); 
    // glDepthFunc(GL_GREATER); // doesn't work !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 
    glColor4f(0,0,0,0.5f); 
    DrawCylinder(); 

    delay(1); 
    glFlush(); 
    glutPostRedisplay(); 
} 
+0

如果清除深度爲1.0,然後只像素渲染深度大於當前深度值越大,你不能指望得出任何東西。 –

+0

此外,真正改變的深度清算價值,你需要調用'glClearDepth()調用''之前glClear()'。 –

+0

我猜cleardepth(1.0)不是我必須改變的原因。從代碼中清除深度1.0 - >繪製對象(改變深度) - >深度測試過程並不奇怪。 (實際上1.0是原始的初始深度值。擦除cleardepth(1.0)行不會給我任何改變。 – Wooni

回答

0

嗨我找到了解決辦法。 即:深度測試(更大)未在一幀後初始化。 深度在幀之後變爲1,則沒有像素通過測試。 因此我必須在第一行輸入glDepthFunc(GL_LESS)。