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 在渲染图元之前就会根据相关设置选项进行判断,以剔

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

时间: 2024-10-12 03:40:37

OPENGL——背面剔除的相关文章

背面剔除(backface culling)

frontface:按照顶点定义的先后顺序,呈顺时针排列的顶点构成的三角形是frontface backface:按照顶点定义的先后顺序,呈逆时针排列的顶点构成的三角形是frontface 通常backface都是不可见的,为了提高渲染速度,DX允许用户对backface进行剔除,有三种剔除方法 D3DCULL_NONE - 不进行任何剔除 D3DCULL_CW  - 按顺时针方向进行剔除 D3DCULL_CCW - 按逆时针方向进行剔除(这是DX的默认剔除方式)

第三章:初始化 OpenGL 4.0

原文地址: http://www.rastertek.com/gl40tut03.html Tutorial 3: Initializing OpenGL 4.0 This tutorial will be the first real introduction to working with OpenGL 4.0. We will address three main things which are initializing OpenGL 4.0, shutting it down, and

三维图像技术与OpenGL基础理论

英文原文:3D Graphics with OpenGL Basic Theory 中文译文:三维图像技术与OpenGL基础理论 1. 计算机图像硬件 1.1 GPU(图像处理单元) 如今,计算机拥有用来专门做图像处理显示的GPU模块,拥有独立的图像处理储存(显存). 1.2 像素和画面 任何图像显示都是基于栅格的格式.一个栅格既是一张二维的像素直角坐标网.像素具有两个属性:颜色和位置.颜色通常使用RGB(红绿蓝)来表示,典型的有用8位或者24位二进制位(真彩色)表示一种颜色.位置则用坐标(x,

【OPENGL】第三章 着色器基础(一)

在这一章,我们会学习什么是着色器(Shader),什么是着色器语言(OpenGL Shading Language-GLSL),以及着色器怎么和OpenGL程序交互. 首先我们先来看看什么叫着色器. Shader(着色器)是用来实现图像渲染的,用来替代固定渲染管线的可编程程序. 着色器替代了传统的固定渲染管线,可以实现3D图形学计算中的相关计算,由于其可编程性,可以实现各种各样的图像效果而不用受显卡的固定渲染管线限制.这极大的提高了图像的画质. 在上一篇文章( http://www.cnblog

OpenGL基础渲染

OpenGL渲染管线(简化版) 客户端-服务器 客户端是存储在CPU存储器中的,并且在应用程序中执行(或者驱动程序),驱动程序将渲染命令和数据组合起来,发动到服务器执行.服务器和客户机在功能上市异步的,他们是各自独立的软件模块或者硬件模块. 着色器 数据先传给顶点着色器,然后是片段着色器,几何着色器(可选择)出现在两者之间 顶点着色器(Vertex Shader) 片段着色器(Fragment Shader) fragment不是最后的像素数据,但和像素对应:fragment需要经过处理,ble

【转】OpenGL概述

英文原文 中文译文 1. 计算机图像硬件 1.1 GPU(图像处理单元) 如今,计算机拥有用来专门做图像处理显示的GPU模块,拥有独立的图像处理储存(显存). 1.2 像素和画面 任何图像显示都是基于栅格的格式.一个栅格既是一张二维的像素直角坐标网.像素具有两个属性:颜色和位置.颜色通常使用RGB(红绿蓝)来表示,典 型的有用8位或者24位二进制位(真彩色)表示一种颜色.位置则用坐标(x,y)表示.原点(0,0)位于左上角,x轴指向右,y轴指向下.这与我们平常 熟知的2D笛卡尔坐标不同,它的y轴

OpenGl学习进程(9)在3D空间的绘制实例

    本节将演示在3D空间中绘制图形的几个简单实例:     (1)在3D空间内绘制圆锥体: #include <GL/glut.h> #include <math.h> #pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"") #define PI 3.1416 GLfloat xRot = 0; GLfloat yRot =

【转载】关于OpenGL的图形流水线

本文转载自 http://blog.csdn.net/racehorse/article/details/6593719 GLSL教程 这是一些列来自lighthouse3d的GLSL教程,非常适合入门.我将边学习边翻译该教程的内容,同时记录在这里,方便以后查询. 流水线概述 下图描述了一个简化的图形处理流水线,虽然简略但仍然可以展示着色器编程(shader programming)的一些重要概念. 一个固定流水线包括如下功能: 顶点变换(Vertex Transformation) 这里一个顶

OpenGL ES 2.0渲染管线

http://codingnow.cn/opengles/1504.html Opengl es 2.0实现了可编程的图形管线,比起1.x的固定管线要复杂和灵活很多,由两部分规范组成:Opengl es 2.0 API规范和Opengl es着色语言规范.下图是Opengl es 2.0渲染管线,阴影部分是opengl es 2.0的可编程阶段. 1. 顶点着色器(VertexShader) 顶点着色器对顶点实现了一种通用的可编程方法. 顶点着色器的输入数据由下面组成: Attributes:使