OpenGL:三维模型,模型网格点与面片同时显示,模型网格轮廓线与面片同时显示

1、 OpenGL多边形偏移函数glPolygonOffset(GLfloat factor,GLfloat units)

如果我们想显示一个三维模型的边缘,我们可能会采用GL_FILL先绘制一遍三维模型,然后在用GL_LINE用不同的颜色再绘制一遍,但是在这种情况下,我们所绘制的边缘线与面片叠在一起,时有时无,会产生非常不好的视觉效果。
OpenGL采用了glPolygonOffset(GLfloat factor,GLfloat units)函数来解决这个问题,该函数有两个参数,如果我们启用了多边形偏移,那么在执行深度测试之前,每个片段的深度值都会加上通过这两个参数所计算的一个偏移量,这个偏移量按以下公式计算

offset=mfactor+runits

m为多边形的最大深度斜率,r为可解析区别的窗口坐标深度值的最小值。
下文,介绍如果将三维模型的边缘线与面片叠加显示以及边缘点与面片叠加显示。

2、边缘线与三维模型面片叠加显示

/*-----先以面片的方式绘制三维网格模型---------------------------------*/
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);//设置绘制模型为绘制前面与背面模型,以填充的方式绘制
glColor3f(ColorRed,ColorGreen,ColorBlue);//设置三维模型绘制颜色
//已经将绘制的命令放在一个显示列表里面了,所以这里之间调用显示列表编号
glCallList(m_DisplayListIndex);
//如果没有用到显示列表,则用绘制语句在这里绘制你想要绘制的三维网格模型
//drawsomething();//在这里写你的绘制语句

/*-----后做多边形偏移,以线的方式显示轮廓线---------------------------*/
glColor3f(1.0,0.0,0.0);//设置偏移轮廓线颜色
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);//将绘制模式改为线
glEnable(GL_POLYGON_OFFSET_LINE);//开启多边形偏移
glPolygonOffset(-1.0, -1.0);//设置偏移量,一般-1,1即可
glCallList(m_DisplayListIndex);//重复绘制你的模型
//如果没有用到显示列表,则用绘制语句在这里绘制你想要绘制的三维网格模型
//drawsomething();//在这里写你的绘制语句
glDisable(GL_POLYGON_OFFSET_LINE);//关闭多边形偏移

这里写图片描述

3、边缘点与三维模型面片叠加显示

/*-----先以面片的方式绘制三维网格模型---------------------------------*/
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);//设置绘制模型为绘制前面与背面模型,以填充的方式绘制
glColor3f(ColorRed,ColorGreen,ColorBlue);//设置三维模型绘制颜色
//已经将绘制的命令放在一个显示列表里面了,所以这里之间调用显示列表编号
glCallList(m_DisplayListIndex);
//如果没有用到显示列表,则用绘制语句在这里绘制你想要绘制的三维网格模型
//drawsomething();//在这里写你的绘制语句

/*-----后做多边形偏移,以点的方式显示轮廓线---------------------------*/
glColor3f(1.0,0.0,0.0);//设置偏移轮廓线颜色
glPolygonMode(GL_FRONT_AND_BACK,GL_POINT);//将绘制模式改为点
glEnable(GL_POLYGON_OFFSET_POINT);//开启多边形偏移
glPolygonOffset(-1.0, -1.0);//设置偏移量,一般-1,1即可
glCallList(m_DisplayListIndex);//重复绘制你的模型
//如果没有用到显示列表,则用绘制语句在这里绘制你想要绘制的三维网格模型
//drawsomething();//在这里写你的绘制语句
glDisable(GL_POLYGON_OFFSET_POINT);//关闭多边形偏移

这里写图片描述

备忘,备忘,备忘。

这里写图片描述

猜你喜欢

转载自blog.csdn.net/hw140701/article/details/78913660