2012-02-17 59 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