Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
openglgldepthfunc不';行不通_Opengl - Fatal编程技术网

openglgldepthfunc不';行不通

openglgldepthfunc不';行不通,opengl,Opengl,我正在编写显示对象隐藏部分的代码。 例如:平板是较大的多边形对象,圆柱体是较小的多边形对象。圆筒被板遮住了。(见下半窗口:圆柱体穿透板材。圆柱体的某些部分被板材隐藏。) 图像由以下代码生成 绘制图版(不绘制到RGB缓冲区。仅捕获深度值) 绘制圆柱体(如果深度测试“小于”通过:这意味着绘制圆柱体的可见部分(较小深度) 对于每个帧,模型将沿y轴旋转。它为每一帧提供了正确的结果 现在,我想将圆柱体的隐藏部分显示为透明。 在使用混合之前,我只想显示圆柱体的隐藏部分。也就是说,我必须显示圆柱体的区域,该区

我正在编写显示对象隐藏部分的代码。 例如:平板是较大的多边形对象,圆柱体是较小的多边形对象。圆筒被板遮住了。(见下半窗口:圆柱体穿透板材。圆柱体的某些部分被板材隐藏。) 图像由以下代码生成

  • 绘制图版(不绘制到RGB缓冲区。仅捕获深度值)
  • 绘制圆柱体(如果深度测试“小于”通过:这意味着绘制圆柱体的可见部分(较小深度)
  • 对于每个帧,模型将沿y轴旋转。它为每一帧提供了正确的结果

    现在,我想将圆柱体的隐藏部分显示为透明。 在使用混合之前,我只想显示圆柱体的隐藏部分。也就是说,我必须显示圆柱体的区域,该区域的深度值大于板块的深度值。然后,我就换衣服

        glDepthFunc(GL_LESS); 
    

    但是,如果我将其更改为GL_GREATER,则不会给出正确的结果。 我在第一帧得到了正确的结果,但在那之后,模型就消失了。(也就是说,模型不显示在窗口上。上视口和下视口都显示) 我不明白原因。救救我


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

    如果将深度清除为1.0,然后仅渲染深度大于当前深度值的像素,则无法绘制任何内容。此外,要实际更改深度清除值,需要在调用
    glClear()
    之前调用
    glClear()
    。我猜cleardepth(1.0)这不是我必须改变的原因。从代码中,清除深度1.0->绘制对象(更改深度)->深度测试过程并不奇怪。(实际上1.0是原始初始深度值。擦除cleardepth(1.0)行不会给我任何更改。
        glDepthFunc(GL_GREATER); 
    
    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();
    }