我正在编写显示对象隐藏部分的代码。 这是一个例子:盘子是较大的多边形物体,而圆柱体是较小的多边形物体。圆筒被板隐藏。 (见下半部窗口:圆柱穿透板。圆柱的某些部分被板隐藏。) 图像由以下代码制作。
对于每个帧,模型沿y轴旋转。它为每个帧提供了正确的结果。
现在,我想将圆柱体的隐藏部分显示为透明。 在使用混合之前,我想只显示圆柱体的隐藏部分。也就是说,我必须显示具有比板深度更大的深度值的圆柱区域。然后,我只是改变
glDepthFunc(GL_LESS);
到
glDepthFunc(GL_GREATER);
但是,如果我将其更改为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();
}
答案 0 :(得分:0)
嘿伙计们我找到了解决方案。 即:深度测试(更大)在一帧之后未初始化。 深度为1帧后,然后没有像素通过测试。 因此,我必须在第一行输入glDepthFunc(GL_LESS)。