从零开始学习OpenGL(5)多边形剔除

漫长的假期休完了,又开始了新一轮的工作。

估计是太久没有运动了,这两天晨跑之后,腿都酸了。现在城市里的工作,真的是亚健康的节奏。

言归正传,下面这几节中,我将会介绍一些常见的OpenGL术语之类的。整个系列教程,也只是按个人意愿来写的,有兴趣的朋友就看看了解下,或者跳跃性的看看。

通常情况下,我们渲染的点,线和三角形都会进行光栅化,并且按照顺序进行绘制。

在这时,会出现一个三角形将另外一个三角形覆盖的问题。如果我们用若干的三角形组成几个多边形,当一个多边形将另外一个多边形覆盖时,渲染出来的效果很可能让我们无法分清三角形的绘制顺序。然而,事实上被覆盖部分的三角形也就是背面我们理应是看不到。这样的渲染不仅对效果有一定的影响,而且因为渲染了本该看不见的部分,对性能也有一定的影响。

在OpenGL中,我们可以通过剔除来解决这个问题。

一般表面剔除按下面的方式开启:

glEnable(GL_CULL_FACE);

相应的按下面的方式关闭:

glDisable(GL_CULL_FACE);

另外,我们还需要通过glCullFace函数指定剔除的是背面还是正面。

void glCullFace(GLenum mode);

mode的参数可用值为GL_FRONT,GL_BACK或GL_FRONT_AND_BACK。这样我们就需要两行代码进行剔除背面。

glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);

当然,很多时候我们需要观察内部结构,进行剔除正面也是很有必要的。
下面是一个简单的带纹理的立方体剔除正面的效果图:

当然,除了剔除以外,还有深度测试混合,都是在处理重叠对象常用的技术,将会在后面的教程中慢慢讲解。

那么这一节就到这里了,随性而写,感谢大家的支持。

发表评论

电子邮件地址不会被公开。