OpenGL之面剔除(转)

转自:https://www.cnblogs.com/ctin/p/6186993.html

 

 

OpenGL之面剔除

由于我们看一个立方体不管从任何方向看最多看到3个平面,那么我们就没有必要去绘制剩下的三个平面,并且这样做将为性能带来超过50%的优化,何乐而不为!

 

 

所以就引入了面剔除(Face culling),此时有个问题是我们如何去判断一个面是正面还是反面呢。OpenGL引入了分析顶点数据的连接顺序(Winding order)。例如:

用代码表示即为

复制代码

 1 GLfloat vertices[] = {
 2     //顺时针
 3     vertices[0], // vertex 1
 4     vertices[1], // vertex 2
 5     vertices[2], // vertex 3
 6     // 逆时针
 7     vertices[0], // vertex 1
 8     vertices[2], // vertex 3
 9     vertices[1] // vertex 2
10 };

复制代码

OpenGL使用这个信息在渲染你的基本图形的时候决定这个三角形是三角形的正面还是三角形的背面。默认情况下,逆时针的顶点连接顺序被定义为三角形的正面。


在顶点数据中,我们定义的是两个逆时针顺序的三角形,但从观察者的方面看,后面的三角形是顺时针的,如果我们仍以1、2、3的顺序以观察者当面的视野看的话。即使我们以逆时针顺序定义后面的三角形,但它现在还是变为顺时针。这正是我们打算剔除(丢弃)的不可见的面!

接下来开始面剔除:

开始之前我们要将顶点数据按逆时针定义,把所有三角的顶点都定义为逆时针是一个很好的习惯

首先glEnable(GL_CULL_FACE)打开面剔除

之后选择要删除背面还是正面glCullFace(GL_BACK);

 

glCullFace函数有三个可用的选项:

 

  • GL_BACK:只剔除背面。
  • GL_FRONT:只剔除正面。
  • GL_FRONT_AND_BACK:剔除背面和正面。

另外我们可以自己设置是逆时针为正还是顺时针为正

glFrontFace(GL_CCW);

默认值是GL_CCW,它代表逆时针,GL_CW代表顺时针顺序。

 

最终渲染

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值