OPENGL——背面剔除

Posted LT.C#

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OPENGL——背面剔除相关的知识,希望对你有一定的参考价值。

Opengl 表面剔除是提高 Opengl 程序渲染效率的一个有效途径。

 

     我们知道,OpenGL 渲染的基本单位是一个个的三角形面片。无论多么复杂的3D 模

型都是由一个个基本的三角型的面片组成的。

 

     既然是一个面片,那必然就有两个面,如果其中有一个面被称为正面,那相应的另一

面就被称为背面。同一时刻我们在看见某一面的同时,另外一面则必然是看不的。

 

 

     在这里我们可以想象一个封闭的不透明的几何体,我们肉眼只能看到它的外面,而

它的内部我们是看不见的。但如果是从 OpenGL的角度来看,如果没有开启表面剔除,

则可能有很多从一般常识上看来是看不见的那一面(比如几何体内部),它也会去渲

染。这显然会大大降低渲染效率和增加不必要的系统开销。

     

     那如何才能确定哪个面需要渲染,哪个面不需要渲染呢。

 

     在 Opengl 中有所谓的正面还有背面,以及是剔除正面还是剔除背面,都有相应的设

置方法,接下来就详细说明。

 

     首先在 OpenGL 中有所谓的“表面剔除”选项。

     可以如下调用开启或关闭表面剔除。

     glEnable(GL_CULL_FACE);
     glDisable(GL_CULL_FACE);

 

     如果开启了表面剔除的选项,则接下来就必须回答两个问题
     1)什么是正面,什么是背面

     2)要剔除正面还是剔除背面

 

     首先回答第一个问题,要如何确定一个面是正面还是背面。

     在 OpenGL 中,可以调用 glFrontFace 函数来设定。
     该函数的原型如下:
          void glFrontFace(GLenum mode);
     

     mode  参数的可选的值有 GL_CW 和 GL_CCW(默认值是 GL_CCW)。
          GL_CW   
               表示顶点的排列顺序是顺时针的面是正面。
          GL_CCW 
               表示顶点的排列顺序是逆时针的面是正面(默认值)。

 

     第二个问题,那究竟是要剔除正面还是背面。

     这个需要调用 glCullFace 函数来决定。
     该函数原型如下:
          void glCullFace(GLenum mode);

          mode 参数有三个可选项
          GL_FRONT                           // 正面剔除
          GL_BACK                              // 背面剔除(默认值)

          GL_FRONT_AND_BACK      // 正面、背面都剔除

 

     经过以上设置,Opengl 在渲染图元之前就会根据相关设置选项进行判断,以剔

除不需要渲染的图元,提高渲染的效率。

以上是关于OPENGL——背面剔除的主要内容,如果未能解决你的问题,请参考以下文章

我的渲染技术进阶之旅OpenGL ES 使用表面剔除和深度测试解决渲染3D模型的时候,出现背面黑点的问题

我的渲染技术进阶之旅OpenGL ES 使用表面剔除和深度测试解决渲染3D模型的时候,出现背面黑点的问题

我的渲染技术进阶之旅OpenGL ES 使用表面剔除和深度测试解决渲染3D模型的时候,出现背面黑点的问题

3.OpenGL渲染技巧

✠OpenGL-8-阴影

一步步学OpenGL(37) -《延迟渲染》