2012-02-17 84 views
3

我設置的格式。OpenGL的深度測試不工作

然後在初始化GL我設置了depthTesting。

void VoxelEditor::initializeGL() 
{ 
    glClearDepth(2000.0);         // Enables Clearing Of The Depth Buffer 
    glEnable(GL_DEPTH_TEST);       // Enables Depth Testing 
    glDepthFunc(GL_LESS);        // The Type Of Depth Test To Do 
    glShadeModel(GL_SMOOTH);       // Enables Smooth Color Shading 
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations 
} 

在paintGL我清除深度緩存。

void VoxelEditor::paintGL() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    draw(); 
} 

我記得它曾經用更少的頂點來工作,所以它可能是我使用了太多的深度緩存來處理(?)。 我有32 * 32 * 32的體素,這是大部分時間的一半,所以98304四邊形。

但是深度測試仍然不起作用,並按執行順序顯示四邊形。

+0

不能是glClearDepth()和glDepthFunc的組合。如果您嘗試刪除glClearDepth()會怎麼樣? – ixM 2012-02-17 21:30:25

+0

不,不起作用。 – RobotRock 2012-02-17 21:36:52

+0

我試着在0到1之間添加* glDepthRange *,但是這並沒有改變任何東西:S – RobotRock 2012-02-17 21:38:20

回答

1

所以這可能是因爲我使用了太多的深度緩衝來處理(?)。

深度緩衝區對頂點沒有意義。它看到的只是傳入的片段,並不重要。

void VoxelEditor::initializeGL() 
{ 
    glClearDepth(2000.0); // Enables Clearing Of The Depth Buffer 

此行不會啓用結算。它是深度緩衝區被清除的值。該值必須在0 ... 1的範圍內。清除深度處於歸一化設備座標中,即在模型視圖,投影和均勻分割已應用之後。默認值是1。

glEnable(GL_DEPTH_TEST); // Enables Depth Testing 
    glDepthFunc(GL_LESS);  // The Type Of Depth Test To Do 
    glShadeModel(GL_SMOOTH) // Enables Smooth Color Shading 
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations 

不,這也不是什麼呢。透視僅僅是一個線性變換,並且始終如一。它的意思是,紋理座標可以以不同的方式插值以提高質量。

} 

我總是建議把這些電話中的繪圖功能,因爲他們沒有任何初始化。他們設置繪圖狀態。 OpenGL是一個狀態機,並且狀態機的一個重要規則是,要麼跟蹤其狀態,只要您打算使用它,就必須將它們置於已知狀態。

+0

我從一個(顯然不好的)教程複製了幾行。我還沒有看glHint選項和glClearDepth,但後者已被刪除,因爲它的默認值是正確的。任何想法,但缺陷是什麼?這不是一個真正的答案.. – RobotRock 2012-02-17 22:10:52

+0

@KajToet:沒有看到你的整個代碼,我甚至猜不出。對不起,但那個水晶球似乎是一個徹頭徹尾的冒險;) – datenwolf 2012-02-18 00:09:13

1

我通過在draw()中設置setDepthTest來解決這個問題。

glMatrixMode(GL_MODELVIEW); 
glEnable(GL_DEPTH_TEST); 
+0

這正是我建議你要做的。查看我答案的最後一段。 – datenwolf 2012-02-18 01:51:57