openglgldepthfunc不';行不通
我正在编写显示对象隐藏部分的代码。 例如:平板是较大的多边形对象,圆柱体是较小的多边形对象。圆筒被板遮住了。(见下半窗口:圆柱体穿透板材。圆柱体的某些部分被板材隐藏。) 图像由以下代码生成openglgldepthfunc不';行不通,opengl,Opengl,我正在编写显示对象隐藏部分的代码。 例如:平板是较大的多边形对象,圆柱体是较小的多边形对象。圆筒被板遮住了。(见下半窗口:圆柱体穿透板材。圆柱体的某些部分被板材隐藏。) 图像由以下代码生成 绘制图版(不绘制到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();
}