在OpenGL中,如果想绘制一个多边形同时绘制其边界,可是先使用多边形模式GL_FILL绘制物体,然后使用多边形模式GL_LINE和不同的颜色再次绘制这个多边形。但是由于直线和多边形的光栅化方式不同,导致位于同一位置的多边形和直线的深度值并不相同,进而导致直线有时在多边形的里面,有时在多边形的外面,这种现象就是“Sitching”。
而Z-fighting主要是指当两个面共面时,二者的深度值一样,深度缓冲就不能清楚的将它们两者分离开来,位于后面的图元上的一些像素就会被渲染到前面的图元上,最终导致图象在帧与帧之间产生微弱的闪光。
解决这两个问题的方法就是使用Polygon Offset,当然你也可以使用模板测试,但Polygon Offset的速度会比模板缓存快。
//绘制多边形
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
Draw3D();
glEnable(GL_POLYGON_OFFSET_LINE);// glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset( factor, units);
glPolygonOffset( factor, units);// glPolygonOffset( factor, units)中factor和units的值视情况而定,具体可参考MSDN.
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
Draw3D();

glPolygonOffset( 0.0f, 0.0f );
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glDisable( GL_POLYGON_OFFSET_LINE );
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
Draw3D();
glPolygonOffset( 0.0f, 0.0f );
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glDisable( GL_POLYGON_OFFSET_LINE );// glDisable( GL_POLYGON_OFFSET_FILL);


本文介绍OpenGL中遇到的Stitching与Z-fighting问题,并提供使用PolygonOffset来解决这些问题的方法。通过调整多边形偏移,可以有效避免多边形及其边界的渲染冲突。
242

被折叠的 条评论
为什么被折叠?



