OpenGL学习笔记十五(面剔除)

OpenGL学习笔记十五(面剔除)

什么是面剔除

在绘制一个正方体时,我们能看到最多的面数是3,而看不到的面虽然被绘制计算,但却无法通过深度测试,这样就做了一倍的无意义计算,倘若能省区这些计算将大幅度提高渲染性能。

环绕顺序

对于一个面,要么朝向摄像机(视口),要么背向摄像机,对于背向摄像机的面就是我们想要剔除的面,如何找出背向相机的面将是解决问题的核心。
OpenGL使用了一个很聪明的技巧,分析顶点数据的环绕顺序(Winding Order)

当我们定义一组三角形顶点时,我们会以特定的环绕顺序来定义它们,可能是顺时针(Clockwise)的,也可能是逆时针(Counter-clockwise)的。每个三角形由3个顶点所组成,我们会从三角形中间来看,为这3个顶点设定一个环绕顺序。
在这里插入图片描述
代码描述:

float vertices[] = {
    // 顺时针
    vertices[0], // 顶点1
    vertices[1], // 顶点2
    vertices[2], // 顶点3
    // 逆时针
    vertices[0], // 顶点1
    vertices[2], // 顶点3
    vertices[1]  // 顶点2  
};

环绕顺序有正向和逆向,OpenGL默认逆时针顶点所定义的三角形将会被处理为正向三角形。实际的环绕顺序是在光栅化阶段进行的,也就是顶点着色器运行之后。这些顶点就是从观察者视角所见的了。
在这里插入图片描述

面剔除函数

面剔除函数应该在一个封闭体使用才有效,对于一个片,不能开启面剔除。
OpenGL中面剔除默认关闭,开启函数:

glEnable(GL_CULL_FACE);

选择要剔除的面:

glCullFace(GL_FRONT);
  • GL_BACK:只剔除背向面。
  • GL_FRONT:只剔除正向面。
  • GL_FRONT_AND_BACK:剔除正向面和背向面。

定义正面:

glFrontFace(GL_CCW);//逆时针环绕为正面
glFrontFace(GL_CW);//顺时针环绕为正面

示例程序

//剔除正面

glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glFrontFace(GL_CW);

//剔除正面

glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT);
glFrontFace(GL_CCW);

在这里插入图片描述

注意

对于一个片来说,我们不能禁用它的面剔除比如Unity中的Plane,正面和反面都应可见

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值