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 背面剔除
在OpenGL种可使用glEnable(GL_CULL_FACE)开启背面剔除功能,即把那些我们看不见的面删除.但在剔除之前我们需要定义正面和背面,这个可以用法线来理解.在数学学科中,法线是用右手法则 ...
- OpenGL学习脚印:背面剔除(Face Culling)
写在前面 在绘制封闭类型的几何对象时,开启背面剔除功能能够提高渲染性能.本节简要介绍下背面剔除,示例程序可以在我的github下载. 什么是背面剔除 当我们观察场景中对象时,一般只能以一定角度来观察, ...
- webgl 背面剔除
- 【OPENGL】第三篇 着色器基础(一)
在这一章,我们会学习什么是着色器(Shader),什么是着色器语言(OpenGL Shading Language-GLSL),以及着色器怎么和OpenGL程序交互. 首先我们先来看看什么叫着色器. ...
- 【转载】关于OpenGL的图形流水线
本文转载自 http://blog.csdn.net/racehorse/article/details/6593719 GLSL教程 这是一些列来自lighthouse3d的GLSL教程,非常适合入 ...
- OpenGL基础渲染
客户端-服务器 客户端是存储在CPU存储器中的,并且在应用程序中执行(或者驱动程序),驱动程序将渲染命令和数据组合起来,发动到服务器执行.服务器和客户机在功能上是异步的,他们是各自独立的软件模块或者硬 ...
- OpenGL.教程
5.第五课:带纹理的立方体.html(http://www.opengl-tutorial.org/cn/beginners-tutorials/tutorial-5-a-textured-cube/ ...
- OpenGL.Tutorial16_ShadowMapping
1. 2. In Tutorial 15 we learnt how to create lightmaps, which encompasses(包含) static lighting. While ...
- OpenGL chapter3 基础渲染
3.1 基础图形管线 三种向OpenGl着色器传递渲染数据的方法:属性,Uniform和纹理.3.2 创建坐标系 3.2.1 正投影 GLFrustum::SetOrthographic(⋯⋯): 3 ...
随机推荐
- vue组件的配置属性
vue组件的声明语法: Vue.component('component-name',{ template:'<p>段落{{prop1}} {{prop2}}</p>', da ...
- 【C#】【Thread】Semaphore/SemaphoreSlim信号量
System.Threading.Semaphore 类表示一个命名(系统范围)信号量或本地信号量. 它是一个对 Win32 信号量对象的精简包装. Win32 信号量是计数信号量,可用于控制对资源池 ...
- CSS3 perspecitve属性
M M .div1 { position: relative; height: 150px; width: 150px; margin: 0px; padding:2px; border: 1px s ...
- 洛谷 1016 / codevs 1046 旅行家的预算
https://www.luogu.org/problem/show?pid=1016 http://codevs.cn/problem/1046/ 题目描述 Description 一个旅行家想驾驶 ...
- struts2: 玩转 rest-plugin
近期使用struts2的rest-plugin,参考官方示例struts2-rest-showcase,做了一个restful service小项目,但官网提供的这个示例过于简单,埋下了巨坑无数,下面 ...
- Java应用程序项目的打包与发行(run.bat形式)
参考: http://www.iteye.com/topic/57312 背景: 以前一直都是在eclipse上面创建应用程序,每次要要运行的时候都要打开eclipse, 直到有个同事叫我帮忙写一个应 ...
- Java 基础【08】.class getClass () forName() 详解
类名.class是Class对象的句柄,每个被加载的类,在jvm中都会有一个Class对象与之相对应. 如果要创建新的对象,直接使用Class对象的局部class.forName就可以了,不需要用ne ...
- C#微信公众号开发系列教程四(接收普通消息)
微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...
- 用canvas画“哆啦A梦”时钟
前言:今天看完了Js书的canvas画布那张,好开心~又是心爱的canvas~欧耶~ 之前看到有人建议我画蓝胖子,对哦,我怎么把童年最喜欢的蓝胖子忘了,为了表达我对蓝胖子的歉意,所以今天画了会动的he ...
- 【python游戏编程之旅】第八篇---pygame游戏开发常用数据结构
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 上一个博客我们一起学习了pygame中冲突检测技术:http://www.cnblogs.com/msxh/ ...