learnopengl学习笔记——面剔除(face culling) - CSDN博客
文章推薦指數: 80 %
这正是面剔除(Face Culling)所做的。
OpenGL能够检查所有面向(Front Facing)观察者的面,并渲染它们,而丢弃那些背向(Back Facing)的面,节省我们很多 ...
learnopengl学习笔记——面剔除(faceculling)
kiss_the_rain86
于 2020-09-1416:26:11 发布
320
收藏
分类专栏:
计算机图形学
原文链接:https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/04%20Face%20culling/
版权
计算机图形学
专栏收录该内容
15篇文章
2订阅
订阅专栏
尝试在脑子中想象一个3D立方体,数数你从任意方向最多能同时看到几个面。
如果你的想象力不是过于丰富了,你应该能得出最大的面数是3。
你可以从任意位置和任意方向看向这个球体,但你永远不能看到3个以上的面。
所以我们为什么要浪费时间绘制我们不能看见的那3个面呢?如果我们能够以某种方式丢弃这几个看不见的面,我们能省下超过50%的片段着色器执行数!
我们如何知道一个物体的某一个面不能从观察者视角看到呢?如果我们想象任何一个闭合形状,它的每一个面都有两侧,每一侧要么面向用户,要么背对用户。
如果我们能够只绘制面向观察者的面呢?
这正是面剔除(FaceCulling)所做的。
OpenGL能够检查所有面向(FrontFacing)观察者的面,并渲染它们,而丢弃那些背向(BackFacing)的面,节省我们很多的片段着色器调用(它们的开销很大!)。
但我们仍要告诉OpenGL哪些面是正向面(FrontFace),哪些面是背向面(BackFace)。
OpenGL使用了一个很聪明的技巧,分析顶点数据的环绕顺序(WindingOrder)。
环绕顺序
当我们定义一组三角形顶点时,我们会以特定的环绕顺序来定义它们,可能是顺时针(Clockwise)的,也可能是逆时针(Counter-clockwise)的。
每个三角形由3个顶点所组成,我们会从三角形中间来看,为这3个顶点设定一个环绕顺序。
我们先定义了顶点1,然后可以选择定义2和3,分别代表顺时针环绕和逆时针环绕两种定义顺序。
floatvertices[]={
//顺时针
vertices[0],//顶点1
vertices[1],//顶点2
vertices[2],//顶点3
//逆时针
vertices[0],//顶点1
vertices[2],//顶点3
vertices[1]//顶点2
};
每组组成三角形图元的三个顶点就包含了一个环绕顺序。
OpenGL在渲染图元的时候将使用这个信息来决定一个三角形是一个正向三角形还是背向三角形。
默认情况下,逆时针顶点所定义的三角形将会被处理为正向三角形。
当你定义顶点顺序的时候,你应该想象对应的三角形是面向你的,所以你定义的三角形从正面看去应该是逆时针的。
这样定义顶点很棒的一点是,实际的环绕顺序是在光栅化阶段进行的,也就是顶点着色器运行之后。
这些顶点就是从观察者视角所见的了。
观察者所面向的所有三角形顶点就是我们所指定的正确环绕顺序了,而立方体另一面的三角形顶点则是以相反的环绕顺序所渲染的。
这样的结果就是,我们所面向的三角形将会是正向三角形,而背面的三角形则是背向三角形。
下面这张图显示了这个效果:在顶点数据中,我们将两个三角形都以逆时针顺序定义(正面的三角形是1、2、3,背面的三角形也是1、2、3(如果我们从正面看这个三角形的话))。
然而,如果从观察者当前视角使用1、2、3的顺序来绘制的话,从观察者的方向来看,背面的三角形将会是以顺时针顺序渲染的。
虽然背面的三角形是以逆时针定义的,它现在是以顺时针顺序渲染的了。
这正是我们想要剔除(Cull,丢弃)的不可见面了!
在顶点数据中,我们定义的是两个逆时针顺序的三角形。
然而,从观察者的方面看,后面的三角形是顺时针的,如果我们仍以1、2、3的顺序以观察者当面的视野看的话。
即使我们以逆时针顺序定义后面的三角形,它现在还是变为顺时针。
它正是我们打算剔除(丢弃)的不可见的面!
面剔除
在本节的开头我们就说过,OpenGL能够丢弃那些渲染为背向三角形的三角形图元。
既然已经知道如何设置顶点的环绕顺序了,我们就可以使用OpenGL的面剔除选项了,它默认是禁用状态的。
在之前教程中使用的立方体顶点数据并不是按照逆时针环绕顺序定义的,所以我更新了顶点数据,来反映逆时针的环绕顺序,你可以从这里复制它们。
尝试想象这些顶点,确认在每个三角形中它们都是以逆时针定义的,这是一个很好的习惯。
要想启用面剔除,我们只需要启用OpenGL的GL_CULL_FACE选项:
glEnable(GL_CULL_FACE);
从这一句代码之后,所有背向面都将被丢弃(尝试飞进立方体内部,看看所有的内面是不是都被丢弃了)。
目前我们在渲染片段的时候能够节省50%以上的性能,但注意这只对像立方体这样的封闭形状有效。
当我们想要绘制上一节中的草时,我们必须要再次禁用面剔除,因为它们的正向面和背向面都应该是可见的。
OpenGL允许我们改变需要剔除的面的类型。
如果我们只想剔除正向面而不是背向面会怎么样?我们可以调用glCullFace来定义这一行为:
glCullFace(GL_FRONT);
kiss_the_rain86
关注
关注
0
点赞
踩
0
评论
0
收藏
扫一扫,分享内容
点击复制链接
专栏目录
高级OpenGL-面剔除
在下二狗的博客
02-21
143
OpenGL-faceculling
1.环绕顺序
有时候我们需要将背对我们的面剔除,因为计算这些面然后在深度测试中丢弃,开销会很大。
所以我们需要知道哪些面试背对我们的,然后将他们提前丢弃。
OpenGL所采用的方法就是根据顶点的环绕顺序判断法向量方向。
通过右手来判断,四指遵循顶点环绕顺序,大拇指所指的就是面的朝向。
2.面剔除
和前面的例子一样,面剔除默认也是关闭的,需要可爱的我们手动来打开
g...
LearnOpenGL学习笔记—高级OpenGL04:面剔除
清清!的博客
09-04
226
LearnOpenGL学习笔记—高级OpenGL03:面剔除1面剔除知识2环绕顺序3面剔除
本节对应官网学习内容:面剔除
1面剔除知识
尝试在脑子中想象一个3D立方体,数数我们从任意方向最多能同时看到几个面。
我们可以从任意位置和任意方向看向这个球体,但永远不能看到3个以上的面。
所以我们为什么要浪费时间绘制我们不能看见的那3个面呢?如果我们能够以某种方式丢弃这几个看不见的面,我们能省下超过50%的片段着色器执行数!
超过50%而不是50%,因为从特定角度来看的话只能看见2个甚至是1个面。
在这种情
参与评论
您还未登录,请先
登录
后发表或查看评论
OpenGL学习笔记十五(面剔除)
绿洲守望者
02-26
277
OpenGL学习笔记十五(面剔除)什么是面剔除环绕顺序面剔除函数示例程序
什么是面剔除
在绘制一个正方体时,我们能看到最多的面数是3,而看不到的面虽然被绘制计算,但却无法通过深度测试,这样就做了一倍的无意义计算,倘若能省区这些计算将大幅度提高渲染性能。
环绕顺序
对于一个面,要么朝向摄像机(视口),要么背向摄像机,对于背向摄像机的面就是我们想要剔除的面,如何找出背向相机的面将是解决问题的核心。
...
OpenGL高级OpenGL篇--面剔除-21
最新发布
weixin_41155760的博客
05-11
59
参考:添加链接描述
OpenGL能够检查所有面向(FrontFacing)观察者的面,并渲染它们,而丢弃那些背向(BackFacing)的面,节省我们很多的片段着色器调用(它们的开销很大!)。
但我们仍要告诉OpenGL哪些面是正向面(FrontFace),哪些面是背向面(BackFace)。
OpenGL使用了一个很聪明的技巧,分析顶点数据的环绕顺序(WindingOrder)。
使用OpenGL的面剔除选项,它默认是禁用状态的。
启用面剔除:glEnable(GL_CULL_FACE);
改变需要
五、OpenGL渲染技巧:正背面剔除
lin1109221208的博客
07-09
862
在介绍正背面剔除前,首先通过一个案例说明为什么我们需要正背面剔除
我们需要绘制一个甜甜圈,整体的绘制流程如下(甜甜圈是OpenGL中提供的模型,直接使用即可)
针对上图的部分函数,作以下说明
SetupRC函数
在金字塔的案例中使用的是观察者不动,物体动的方式,设置观察者到物体的距离,在甜甜圈案例中使用新的方式设置观察者到物体的距离,即观察者动,物体不动,并创建一个甜甜圈
RenderScene函数
主要是用于绘制甜甜圈,其流程如下所示
最终,得到的甜甜圈如图所示
/975F1004A621957F6
OpenGL学习之面剔除——FaceCulling
u011371324的专栏
03-12
1217
前言
我们在做渲染时,有时候为了提升性能,特别是在硬件性能有限的情况下,如在手机上做3D图形渲染时(OpenGLES),如果不做性能优化,很难达到预期的效果。
因此,引出本篇文章所要说的主题——面剔除(FaceCulling),当然优化的方式还有其他方式。
在特定的硬件上渲染的三角面片是有限的,那么这种情况下,就应该减少不必要的三角面片,提升性能。
加入有一个立方体,正常情况下,我们最多只...
OpenGL背面剔除
jk823394954的专栏
08-18
2522
背面剔除就是对几何体的背面,我们看不到的三角形进行剔除,以便提高性能
我们先来看一个没有背面剔除的例子
这是一个类似于游泳圈的模型,稍微的对其旋转了一下,从侧面看到的效果如下图:
我们看到有一些黑色的线条这是因为在没有开启背面剔除模式的情况下,三角形的排序可能会出现混乱,从而造成这种现象。
我们来看看怎么来写这个例子
工程的创建在前面已经讲过了
首先是m
OpenGL--面剔除
men_tou的博客
09-09
70
顶点连接顺序
实际的顶点连接顺序是在光栅化阶段计算的,默认情况下,逆时针的顶点连接顺序被定义为三角形的正面。
面剔除
开启:
glEnable(GL_CULL_FACE);
设置:
glCullFace(GL_BACK);
glCullFace函数有三个可用的选项:
GL_BACK:只剔除背面。
GL_FRONT:只剔除正面。
GL_FRONT_AND_BACK:剔除背面和正面。
...
面剔除Faceculling
u014767384的博客
08-18
921
1.面剔除Faceculling
1.1环绕顺序WindingOrder
1.2面剔除Faceculling
1.面剔除Faceculling
尝试在脑子中想象一个3D立方体,数数你从任意方向最多能同时看到几个面。
如果你的想象力不是过于丰富了,你应该能得出最大的面数是3。
你可以从任意位置和任意方向看向这个球体,但你永远不能看到3个以上的面。
所以...
OpenGL核心技术之面剔除
海洋个人博客
02-09
2583
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。
CSDN视频网址:http://edu.csdn.net/lecturer/144 面剔除技术在游戏开发中主要目的是提高效率,在现实生活中也会经常遇到这种情况,比如我们观看一幢大厦
OpenGL之面剔除
weixin_30342209的博客
12-16
49
由于我们看一个立方体不管从任何方向看最多看到3个平面,那么我们就没有必要去绘制剩下的三个平面,并且这样做将为性能带来超过50%的优化,何乐而不为!
所以就引入了面剔除(Faceculling),此时有个问题是我们如何去判断一个面是正面还是反面呢。
OpenGL引入了分析顶点数据的连接顺序(Windingorder)。
例如:
用代码表示即为
1GLfloat...
OpenGL学习笔记(十六)混合和面剔除
永远的小白虾的博客
07-08
153
首先要做的就是通过根据贴图的alpha值渲染一些草在地面上。
老样子还是先是顶点着色器
#version330core
outvec2TextureCoord;
outvec4vertexColor;
layout(location=0)invec3aPos;
layout(location=1)invec3aColor;
layout(location=2)invec2aTextureCoord;//纹理坐标
uniformmat4modelMat;//模型矩阵
u
OpenGL学习脚印:背面剔除(FaceCulling)
热门推荐
王定桥的专栏
08-21
1万+
写在前面
在绘制封闭类型的几何对象时,开启背面剔除功能能够提高渲染性能。
本节简要介绍下背面剔除。
什么是背面剔除当我们观察场景中对象时,一般只能以一定角度来观察,那么对象的某些面我们是看不到的,例如你观察一个立方体,最多只能同时看到3个面,有时只能看到1个面,而我们绘制时如果不采取剔除背面的措施,则要绘制6个面,其中包括一些,我们根本看不到的面。
对于立方体这个面较少的几何对象,性能开销不明显
openGL之深度测试、表面剔除、剪裁---openGL学习笔记(五)
a358333644的博客
02-29
1676
深度测试:
上次用画三角形扇面的方法绘制的棱锥,发现一个问题,就是无论将棱锥如何旋转,底面总是可见的。
这与实际不符,实际中,当我们从棱锥的顶点向下看的时候是看不见底面的,出现这种情况的原因是因为,我们先画的棱锥锥面,后画的棱锥底面,在openGL中后画出来的部分,会一直可见。
那么为了解决这个问题,我们就需要用到openGL中的深度测试。
深度测试简单来说就是,让应该被挡住的物体不显示。
OpenGL-面剔除
笃笃前行的专栏
01-21
202
OpenGL-面剔除环绕顺序
如果我们想象任何一个闭合形状,它的每一个面都有两侧,每一侧要么面向用户,要么背对用户。
如果我们能够只绘制面向观察者的面呢?
这正是面剔除(FaceCulling)所做的。
OpenGL能够检查所有面向(FrontFacing)观察者的面,并渲染它们,而丢弃那些背向(BackFacing)的面,节省我们很多的片段着色器调用(它们的开销很大!)。
但我们仍要告诉O...
OpenGL-背面剔除深度测试
rv0p111
02-09
704
一、进行创建用一个最简单的案例来说明下这两个技术吧。
首先,我们可以使用GLTools里面的gltMakeTorus函数来为我们去创建一个类似于甜甜圈的模型。
二、解释说明当我们不旋转的时候创建的模型是这样的三、旋转之后我们发现,为什么一旋转就会出现黑边?那是因为一些远端三角形绘制在了近端三角形上,为什么这么说因为三角形的背面其实是黑色的,为什么是黑色?因为这个模型就是这么设定的,然后我们一旋转可能就...
Opengl-面剔除(一种优化方式)
alex1992azh的博客
08-17
479
前言
我们已经可以正常的渲染一个物体也好加载一个模型也好,比如立方体,可以正常的渲染,然后我们还可以挪动摄像机来观察每一个面,但是,有一个问题想一想。
我们挪动相机进入了立方体里面就会发现里面也渲染了。
这。
。
问题出来了。
可能很多东西我们都不希望或者根本没想着把里面也渲染的那么好。
。
我们看不到还浪费这个资源去计算渲染干嘛?
面剔除
OpenGL能够检查所有面向(FrontFac...
多边形的正反面,剔除
Wadejr的专栏
09-02
982
OPENGL中采用的是简单的凸多边形,要求多边形的各边不能相交。
OPENGL中规定:如果多边形的顶点以逆时针顺序出现在屏幕上,则为“正面”。
我们通过使用voidglFrontFace(GLenummode)函数可以交换图形的正反面。
默认情况下,mode是GL_CCW,即逆时针为正面;GL_CW顺时针为正面。
为了丢弃一些被OPENGL认为是背面的多边形,应采用剔除。
面剔除FaceCulling
killallpigs的专栏
02-09
1435
高级opengl
尝试在头脑中想象一下有一个3D立方体,你从任何一个方向去看它,最多可以同时看到多少个面?你最终最多能数出来的面是3个。
你可以从一个立方体的任意位置和方向上去看它,但是你永远不能看到多于3个面。
所以我们为何还要去绘制那三个不会显示出来的3个面呢。
如果我们可以以某种方式丢弃它们,我们会提高片段着色器超过50%的性能!
我们如何知道某个面在观察者的视野中不会出现
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022CSDN
皮肤主题:大白
设计师:CSDN官方博客
返回首页
kiss_the_rain86
CSDN认证博客专家
CSDN认证企业博客
码龄4年
暂无认证
116
原创
21万+
周排名
2万+
总排名
9万+
访问
等级
1831
积分
35
粉丝
67
获赞
19
评论
345
收藏
私信
关注
热门文章
unity用animator控制动画的基本方法(详细)
9352
简洁描述leadingbass原理
7446
unity2d角色顺畅的移动+跳跃+动画切换
5304
彻底理解unity里的Time.deltatime
4412
unity协程coroutine简明教程
4409
分类专栏
计算机图形学
15篇
游戏引擎踩坑
pytorch龙良曲
pytorch
14篇
读书笔记
1篇
QT小项目
2篇
PAT
13篇
javaweb
15篇
Bukkit
1篇
unityshader
5篇
软件体系结构
1篇
unity
10篇
算法
46篇
机器学习
14篇
DirextX11
1篇
音乐
8篇
matlab
2篇
最新评论
贪心法——牛栏问题
耿耿954:
思路很受启发
pycharm中根据requirements.txt建立虚拟环境
一个立冬:
多谢
pycharm中根据requirements.txt建立虚拟环境
TangXin95:
谢谢大佬
DragonBones+Unity实现换装
大家一起学编程(python):
你以为我发现了好文章吗?不,你以为的没错
DragonBones+Unity实现换装
我爱人工智能:
写的不错!期待大佬回访!
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
PoseAnimator让矢量图捕捉你的动作,然后动起来。
(翻译学习)
unity摄像机追踪屏幕抖动的问题
彻底理解unity里的Time.deltatime
2022年4篇
2021年24篇
2020年74篇
2019年52篇
目录
目录
分类专栏
计算机图形学
15篇
游戏引擎踩坑
pytorch龙良曲
pytorch
14篇
读书笔记
1篇
QT小项目
2篇
PAT
13篇
javaweb
15篇
Bukkit
1篇
unityshader
5篇
软件体系结构
1篇
unity
10篇
算法
46篇
机器学习
14篇
DirextX11
1篇
音乐
8篇
matlab
2篇
目录
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值
延伸文章資訊
- 1OpenGL Tutorial 16 - Face Culling & FPS Counter - YouTube
- 2A Compact Method for Backface Culling - Gamasutra
Backface culling is an important part of how a 3D engine performs visibility checks. Its purpose ...
- 3OpenGL學習腳印:背面剔除(Face Culling) - 程式人生
OpenGL學習腳印:背面剔除(Face Culling). 阿新• • 發佈:2019-02-02. 寫在前面在繪製封閉型別的幾何物件時,開啟背面剔除功能能夠提高渲染效能。本節簡要介紹下背面 ...
- 4剔除(Culling) | 逍遙文工作室
其中在遊戲設計中,剔除又可細分為三類:不可見剔除(visibility culling)、遮擋剔除(occlusion culling)、背面剔除(backface culling)。
- 5面剔除
这正是面剔除(Face culling)所要做的。OpenGL允许检查所有正面朝向(Front facing)观察者的面,并渲染它们,而丢弃所有背面朝向(Back facing)的面,这样就节约...