LearnOpenGL学习笔记——面剔除

【LearnOpenGL 学习笔记】高级OpenGL LearnOpenGL 学习笔记 高级OpenGL 阅读详情

面剔除

尝试在脑子中想象一个3D立方体,数数你从任意方向最多能同时看到几个面。如果你的想象力不是过于丰富了,你应该能得出最大的面数是3。你可以从任意位置和任意方向看向这个球体,但你永远不能看到3个以上的面。所以我们为什么要浪费时间绘制我们不能看见的那3个面呢?如果我们能够以某种方式丢弃这几个看不见的面,我们能省下超过50%的片段着色器执行数!
如果我们想象任何一个闭合形状,它的每一个面都有两侧,每一侧要么面向用户,要么背对用户。如果我们能够只绘制面向观察者的面呢?

这正是面剔除(Face Culling)所做的。OpenGL能够检查所有面向(Front Facing)观察者的面,并渲染它们,而丢弃那些背向(Back Facing)的面,节省我们很多的片段着色器调用(它们的开销很大!)。但我们仍要告诉OpenGL哪些面是正向面(Front Face),哪些面是背向面(Back Face)。OpenGL使用了一个很聪明的技巧,分析顶点数据的环绕顺序(Winding Order)。

环绕顺序

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

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

OpenGL在渲染图元的时候使用这个信息来决定一个三角形是一个正向三角形还是北向三角形。
在这里插入图片描述

如何做面剔除

OpenGL能够丢弃那些渲染为背向三角形的三角形图元。既然已经知道如何设置顶点的环绕顺序了,我们就可以使用OpenGL的面剔除选项了,它默认是禁用状态的。

	//要想启用面剔除,我们只需要启用OpenGL的GL_CULL_FACE选项
	glEnable(GL_CULL_FACE);

目前我们在渲染片段的时候能够节省50%以上的性能,但注意这只对像立方体这样的封闭形状有效。当我们想要绘制上一节中的草时,我们必须要再次禁用面剔除,因为它们的正向面和背向面都应该是可见的。

//OpenGL允许我们改变需要剔除的面的类型。如果我们只想剔除正向面而不是背向面会怎么样?我们可以调用//glCullFace来定义这一行为:
glCullFace(GL_FRONT);
//GL_BACK:只剔除背向面。
//GL_FRONT:只剔除正向面。
//GL_FRONT_AND_BACK:剔除正向面和背向面。

glCullFace的初始值是GL_BACK。除了需要剔除的面之外,我们也可以通过调用glFrontFace,告诉OpenGL我们希望将顺时针的面(而不是逆时针的面)定义为正向面:

glFrontFace(GL_CCW);

默认值是GL_CCW,它代表的是逆时针的环绕顺序,另一个选项是GL_CW,它(显然)代表的是顺时针顺序。我们可以来做一个实验,告诉OpenGL现在顺时针顺序代表的是正向面:

【LearnOpenGL学习笔记】——16.混合测试 文章目录1.丢弃片段2.半透明图形渲染——使用混合(blend)3.练习 1.丢弃片段 丢弃纹理中透明部分的片段,保留不透明部分的片段 如何加载透明纹理? stb_image会自动加载,但我们需要告诉OpenGL 因此使用 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); 2.半透明图形渲染——使用混合(blend) (1)混合开启:glEnable(GL_BLEND); 阅读详情

相关推荐

OpenGL面剔除(Face Culling)编程

通过启用面剔除功能并定义剔除规则,我们可以排除不可见的三角形面,从而减少不必要的渲染开销。然而,我已经在上面的回答中给出了使用面剔除功能的示例代码的框架。面剔除(Face Culling)是OpenGL中一种优化技术,它可以通过排除不可见的三角形面来提高渲染性能。当渲染一个复杂的三维场景时,只有可见的面需要被绘制,而背面或不可见的面可以被剔除掉,从而减少不必要的渲染开销。上述代码将指定逆时针方向的三角形面被认为是正面,而顺时针方向的三角形面被认为是背面。上述代码将启用面剔除功能,并默认剔除背面的三角形面。

CyberByte的博客 326

QT+OpenGL 面剔除和帧缓冲

本篇完整工程见gitee:QtOpenGL 对应点的tag,由turbolove提供技术支持,您可以关注博主或者私信博主

turbolove的博客 1104

Isograph工具解析:FTA、RBD、FMECA与ETA在可靠性工程中的实战应用

可靠性工程是确保复杂系统安全稳定运行的核心学科,它通过量化方法评估和提升系统在特定条件下的无故障运行能力。其基本原理涉及对系统失效模式、概率及影响进行建模与分析,旨在将定性的工程经验转化为定量的决策依据。在工程实践中,故障树分析(FTA)和可靠性框图(RBD)是两种互为补充的关键技术:FTA采用自上而下的演绎逻辑,追溯导致顶事件发生的所有可能故障组合;RBD则采用自下而上的归纳逻辑,描述系统成功运行所需的功能结构关系。这些分析技术的工程价值在于能够提前识别设计薄弱环节,量化风险,并指导设计优化与维修策略制定

weixin_42522009的博客 315

OpenGL 面剔除

OpenGL能够检查所有面向观察者的面,并渲染它们,而丢弃那些背向的面,节省我们很多的片段着色器调用(它们的开销很大!但我们仍要告诉OpenGL哪些面是正向面,哪些面是背向面。OpenGL使用了一个很聪明的技巧,分析顶点数据的环绕顺序。

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 649

GD32F103VBT6串口OTA升级保姆级教程:当硬件没留Boot0引脚时,我是如何用Keil和Ymodem搞定的

本文详细介绍了GD32F103VBT6在无Boot0引脚情况下的串口OTA升级方案,通过Keil工程改造和Ymodem协议实现可靠固件更新。文章涵盖Bootloader配置、APP工程调整、Ymodem传输优化等关键步骤,为嵌入式开发者提供了一套完整的解决方案,特别适用于封闭式设备的远程更新需求。

weixin_28744613的博客 183

Windows C语言编程:Beep API实现蜂鸣器原理与实战

如果你在 Windows 上写过 C 语言程序,想给程序加个简单的提示音,第一个想到的可能是 printf("\a") 。这个转义字符确实能在某些终端里发出“嘀”的一声,但它太原始、太不可控了,而且很多时候根本没声音。那么,有没有一种更“Windows”、更可控、更专业的方法来让你的程序“说话”呢? 答案是肯定的,而且它比你想象的要强大和复杂。Windows 提供了一个名为 Beep 的 API 函数,专门用于生成蜂鸣声。你可能觉得这功能太简单,甚至有点过时——不就是让电脑“哔”一声吗?但恰恰是这个看似简单

weixin_34109408的博客 395

learnopengl学习笔记——面剔除(face culling)

尝试在脑子中想象一个3D立方体,数数你从任意方向最多能同时看到几个面。如果你的想象力不是过于丰富了,你应该能得出最大的面数是3。你可以从任意位置和任意方向看向这个球体,但你永远不能看到3个以上的面。所以我们为什么要浪费时间绘制我们不能看见的那3个面呢?如果我们能够以某种方式丢弃这几个看不见的面,我们能省下超过50%的片段着色器执行数! 我们如何知道一个物体的某一个面不能从观察者视角看到呢? 如果我们想象任何一个闭合形状,它的每一个面都有两侧,每一侧要么面向用户,要么背对用户。如果我们能够只绘制面向观察者的面

kiss_the_rian的博客 835

QT的温湿度显示系统

大家好,这里是石侃侃的博客,欢迎前来讨论这篇文章介绍的是DHT11在2440上的基于Qt5.6的应用基于单片机系统的温湿度监测系统构成框图如图2-1所示。图2-1 系统构成框图该系统采用单片机s3c2440作为了本设计的核心元件。利用LCD作为了显示器件,利用触摸屏作为用户界面输入设备,第一行显示当前实时的温度,湿度,第二行依次显示历史时刻最高的温度值,最高的湿度值。第三行是一个文本框,记录了程...

zxpcus的博客 1万+

QT之OpenGL面剔除

QT之OpenGL面剔除

weixin_41111116的博客 397

lumerical中DEVICE和MODE模块的交互使用(真的很干货!!可以自信的说网上绝对找不到比我更详细的步骤了)

几个脚本文件很重要! Lumerical仿真流程: 一、DEVICE: (1).建模并且运行完之后,在脚本提示符下键入以下脚本行以运行plotDopingProfile.lsf如图1(文件名如果索引不到的话就可以把文件直接用notepad++打开,然后把代码直接输入到device中script脚本中 如图2)脚本文件并生成下图 如图3: (图2) (图1) (图3) (2).仿真...

1万+

告别迷茫!新手如何从RTKLIB命令行程序入手,快速理解GNSS解算全流程

本文为GNSS新手提供RTKLIB命令行程序实战指南,重点介绍如何通过`rnx2rtkp`后处理解算工具快速掌握GNSS解算全流程。从环境搭建、程序编译到核心算法解析,帮助读者理解RTKLIB源码结构,并通过真实数据处理案例演示完整解算过程,是入门GNSS定位技术的实用教程。

weixin_42524226的博客 359

LearnOpenGL学习笔记—高级OpenGL 04:面剔除

LearnOpenGL学习笔记—高级OpenGL 03:面剔除1 面剔除知识2 环绕顺序3 面剔除 本节对应官网学习内容:面剔除 1 面剔除知识 尝试在脑子中想象一个3D立方体,数数我们从任意方向最多能同时看到几个面。 我们可以从任意位置和任意方向看向这个球体,但永远不能看到3个以上的面。 所以我们为什么要浪费时间绘制我们不能看见的那3个面呢?如果我们能够以某种方式丢弃这几个看不见的面,我们能省下超过50%的片段着色器执行数! 超过50%而不是50%,因为从特定角度来看的话只能看见2个甚至是1个面。在这种情

清清!的博客 548

【Claude】Extra inputs are not permitted 错误:代理剥离 Beta 标头的解决方案 bug报错已解决

深入分析Claude Code Extra inputs are not permitted 400错误的技术原理,解析代理剥离Beta标头的根因与多种修复方案。

一键难忘的博客 145

【learnOpenGL学习笔记_19】OpenGL高级教程 - 面剔除 学习实践

本文我们来学习面剔除的原理和操作方法。

同学小张的博客 802

RK3568平台(USB篇)USB Gadget 驱动

USB 设备驱动,按照设备端关联的 USB 控制器 是工作在 主模式 还是 从模式,分为 USB 设备主机侧驱动 (主模式),或者 USB 设备从机侧驱动 (从模式)。同时,工作在 主模式 的 USB 控制器,称为 USB 主机控制器 (UHC: USB Host Controller),工作在 从模式 的 USB 控制器,称为 USB 设备控制器 (UDC: USB Device Controller)。有的 USB 控制器,只能工作在 主模式 或 从模式 中的某一种;

weixin_49303682的博客 1438

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【OpenGL】LearnOpenGL学习笔记15 - 面剔除

LearnOpenGL学习笔记 - 面剔除

Duo1J的随笔 652

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

LearnOpenGL——混合、面剔除

实际的环绕顺序是。

weixin_70073176的博客 1006

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

LearnOpenGL15——面剔除

转载自 https://blog.youkuaiyun.com/qq_36696486/article/details/104422836 https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/04%20Face%20culling/ 什么是面剔除 在绘制一个正方体时,我们能看到最多的面数是3,而看不到的面虽然被绘制计算,但却无法通过深度测试,这样就做了一倍的无意义计算,倘若能省区这些计算将大幅度提高渲染性能。 环绕顺序 对于一个面,要么朝向摄像机(视口),要么

白小飞 224

LearnOpenGL-高级OpenGL-4.面剔除

OpenGL能够检查所有面向(Front Facing)观察者的面,并渲染它们,而丢弃那些**背向**(Back Facing)的面,节省我们很多的片段着色器调用(它们的开销很大!)。 但我们仍要告诉OpenGL哪些面是正向面(Front Face),哪些面是背向面(Back Face)。OpenGL使用了一个很聪明的技巧,分析顶点数据的**环绕顺序**(Winding Order)。

qq_34060370的博客 734

LearnOpenGL——高级OpenGL(四)面剔除

摘要:OpenGL的面剔除技术通过分析三角形顶点的环绕顺序,智能地剔除不可见的背面,大幅提升渲染效率。默认情况下,逆时针定义的三角形被视为正向面。启用面剔除后,背向面将被自动丢弃,节省50%以上的片段着色计算。开发者可通过glCullFace和glFrontFace函数灵活控制剔除行为,适用于封闭物体但不适用于需要双面显示的物体(如植被)。这项技术在不影响视觉效果的前提下显著优化了3D渲染性能。

QQ805009795的博客 586

LearnOpenGL(十八)之面剔除

LearnOpenGL(十八)之面剔除

ckg3824278的博客 512

learnOpenGL 4.4 面剔除

在实际显示中,我们一般只能看到一个物体少于等于50%的部分,比如一个立方体,我们最多看到三个面。 如此一来,我们只绘制面向我们的面就可以大大提升渲染效率。 这就是所谓的面剔除。 glEnable(GL_CULL_FACE); 原理 面剔除的原理主要是,通过构成三角形的顶点的顺序判断正反。 如果在正面三个点为逆时针顺序,则在反面看它们成顺时针。 通过下面这个函数我们可以设定朝哪个方向为正,CCW为逆时针,CW为顺时针。默认为逆时针。 glFrontFace(GL_CCW); 这样设置以后,从相机角度看为顺

qq_43533956的博客 220

LearnOpenGL笔记——四、高级OpenGL:“面剔除”与“帧缓冲”

四、高级OpenGL:“面剔除”、“帧缓冲”和“立方体贴图” 4.4 面剔除 不绘制我们看不到的面 如何只绘制面向观察者的面呢? OpenGL使用了一个很聪明的技巧,分析顶点数据的环绕顺序(Winding Order)! 环绕顺序 简而言之,对于每个面,定义时面向观察者,顶点顺序为逆时针,这样在光栅化时任何顶点顺序为顺时针的面都是背向观察者的,可以剔除! 面剔除 确认在每个三角形中它们都是以逆时针定义的,这是一个很好的习惯。 要想启用面剔除,我们只需要启用OpenGL的GL_CULL_FACE选项

weixin_44478658的博客 386

(自用)learnOpenGL-高级OpenGL-面剔除Face Culling

一个立方体有6个面,但是我们最多只能看大3个面,所以如果我们可以丢弃那几个面,就可以加速我们的程序了。但是问题也来了,我们如何确定哪些面camera能够看到,哪些不能看到。我们现在规定:我们只画面向用户的面!什么意思?一个面他都有两面,一面面向用户,一面背对。我们只画面向用户的。或者说,我们现在的问题变成了如何规定正向面和背向面。在opengl中有个很聪明的技巧,就是分析顶点数据的。我们在定义一组三角形顶点的时候,肯定是要么顺时针表示,要么逆时针表示。

SHIgaNatsuki的博客 308

learnopengl网站学习10.面剔除.txt

确认三角形是逆时针排序的,然后glEnable(GL_CULL_FACE);开启面剔除 glCullFace(GL_FRONT); glCullFace函数有三个可用的选项: GL_BACK:只剔除背向面。 GL_FRONT:只剔除正向面。 GL_FRONT_AND_BACK:剔除正向面和背向面。 这个可以设置 设置正向面的环绕顺序 glFrontFace(GL_CCW); 默认值是GL_CCW,它代表的是逆时针的环绕顺序,另一个选项是GL_CW,它(显然)代表的是顺时针顺序。 ...

qq_56129271的博客 1483

LearnOpenGL学习(高级OpenGL -- 深度测试,模板测试,环绕顺序)

用来防止被阻挡的面渲染到其他面的前面,深度缓冲就像颜色缓冲,在每个片段中储存了信息,当深度测试(Depth Testing)被启用的时候,OpenGL会将一个片段的深度值与深度缓冲的内容进行对比。OpenGL会执行一个深度测试,如果这个测试通过了的话,深度缓冲将会更新为新的深度值。如果深度测试失败了,片段将会被丢弃。深度缓冲运行在是GLSL内建变量,它是一个vec3,x和y分量代表了片段的屏幕坐标(左下角为原点),z分量为片段的深度值。

zaizai1007的博客 1200
上一篇: LearnOpenGL学习笔记——混合
下一篇: LearnOpenGL学习笔记——帧缓冲
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值