opengl glDepthFunc不起作用

时间:2017-02-06 02:20:59

标签: opengl

我正在编写显示对象隐藏部分的代码。 这是一个例子:盘子是较大的多边形物体,而圆柱体是较小的多边形物体。圆筒被板隐藏。 (见下半部窗口:圆柱穿透板。圆柱的某些部分被板隐藏。) 图像由以下代码制作。

  1. 绘制板(不将其绘制到RGB缓冲区。仅捕获深度值)
  2. 绘制圆柱体(如果深度测试'少'通过:这意味着绘制圆柱体的可见部分(更小的深度))
  3. 对于每个帧,模型沿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();
    }
    

1 个答案:

答案 0 :(得分:0)

嘿伙计们我找到了解决方案。 即:深度测试(更大)在一帧之后未初始化。 深度为1帧后,然后没有像素通过测试。 因此,我必须在第一行输入glDepthFunc(GL_LESS)。