OpenGL中关于模板缓冲区的详细解释

opengl使用帧缓冲区及模板缓存记录 opengl使用帧缓冲区及模板缓存记录 这篇文章用于记录学习帧缓存区过程中的一些知识点,由于大部分文章所涉及的知识点都是相似的,所以只能自己在摸索的过程中记录一二,目前只是初学,可能还有很多地方理解出现偏差,请各位大佬批评指正。 创建帧缓存区 glGenBuffers(1,&fbo); 创建帧缓存区的步骤比较简单,只需在创建好后绑定到合适的绑定点上。 接下来需要创建深度、模板和颜色缓冲区,用于添加到帧缓存区 glGenRenderbuffers(1,&depthbuffer);//创建 阅读详情

模板缓冲区的概念,至今依然不是特别理解,这篇博客写的很好,相信对大家的理解也有帮助。

模板缓存是深度缓存的扩充,当你需要控制哪一个像素需要被渲染,哪一个像素需要被忽略时,模板缓存能够为你提供更多的方法。和深度缓存一样,模板缓存存储了所有像素的模板值,但是这次你必须手动控制这些值如何改变。记住,如果一个像素深度测试失败了的话,模板测试将不会再决定该像素是否绘制,而像素会反过来影响模板缓存中的值。

为了让大家对模板缓存有一个直观的认识,让我们来分析一下下面这个例子:

模板缓存实例

如上图所示:模板缓存首先被清0,我们的立方体将正常显示,然后我们将模板缓存中的一个矩形区域设置为1,我们的立方体在绘制时,我们将只绘制模板值为1的像素区域,从而达到控制像素绘制与否的目的。现在你对模板缓存的作用有了一个初步了解了,让我们来看看OpenGL中是如何使用它的:

和深度缓存一样,首先你要启动模板测试来让模板缓存生效,

启动模板测试

设置模板值

然后需要设置缓存中各个像素的模板值, 我们在确定模板的形状后,我们通常只需要调用一次绘制命令就可以达到利用模板裁剪画面的效果,如果你想像上面的例子那样创建一个矩形的裁剪区域,只需要绘制一个2D的矩形区域就行了。只不过在你绘制之前需要使用以下几个API来控制一下模板缓存的值:

首先是glStencilFunc,这个api是用来模板测试使用的比较函数以及参数的,参数如下:

func:比较函数

ref: 比较函数用来比较的参数值。

mask: 掩码,如果模板缓存包含了s个位平面,那么mask参数中较低的s个位数据将分别于模板缓存中的值,以及ref值进行位与操作,然后再进行具体的比较。

第一个参数中的比较函数可以是以下任意一种:

GL_NEVER:无论模板值为何值,都不能通过模板测试

GL_LESS:测试模板值是否小于ref值

GL_LEQUAL:测试模板值是否小于等于ref值

GL_GREATER:测试模板值是否大于ref值

GL_GEQUAL:测试模板值是否大于等于ref值

GL_EQUAL:测试模板值是否等于ref值

GL_NOTEQUAL:测试模板值是否不等于ref值

GL_ALWAYS:无论模板值为何值,总是能通过模板测试。

例如:如果你不想让小于2的模板值通过模板测试,你只需要这样调用:

glStencilFunc调用示例

然后是glStencilOp,这个api是用来指定深度测试以及模板测试以后对模板值的操作,参数如下:

sfail: 模板测试失败后执行的操作

dpfail: 模板测试通过但深度测试不通过时候执行的操作。

dppass: 模板测试和深度测试都通过后,或者深度测试未开启时执行的操作。

以上三个参数的值可以是以下任意一种:

GL_KEEP: 保持当前值

GL_ZERO: 将模板值清0

GL_REPLACE: 模板值将会被替换为glStencilFunc中的ref参数值。

GL_INCR: 如果模板值小于最大值,模板值将会+1

GL_INCR_WRAP: 和GL_INCR一样,只是遇到最大值时,模板值会清0。

GL_DECR:如果模板值大于0,模板值将会-1。

GL_DECR_WRAP: 和GL_DECR一样,只是当模板值减到0时,会变为最大值。

GL_INVERT: 将模板值按位取反。

最后,glStencilMask可以为模板缓存设置掩码,由于模板缓存中每个模板值是一个无符号的整形数,因此我们的掩码也是一个0-0xFFFFFFFF范围内的数,每个模板值都会与掩码做与运算后再使用,默认掩码为0xFFFFFFFF。

现在回到我们的例子,我们要把一个矩形区域的模板值设置为1,我们需要进行如下操作:

模板缓存使用示例

这里我们可以看到,我们通过glStencilFunc函数让任意模板值都能通过模板测试,这样如果深度测试也通过的话就会根据glStencilOp的第三个参数设置的GL_REPLACE将模板值都替换为ref参数值1,从而达到了将所有模板值设置为1的目的。而图中的矩形区域并不需要真正的绘制,它只需要用来指定哪些像素的模板值生效,这样就不需要我们去逐像素的去设置模板缓存值了。

屏蔽颜色和深度缓存

glColorMask函数允许你指定哪些数据输入颜色缓存,4个参数分别对应RGBA值,这里我们将4个参数都置为GL_FALSE,意味着所有颜色数据都不会输入到颜色缓存中。而深度缓存需要另外调用glDepthMask并传入GL_FALSE参数来屏蔽深度值。这样我们矩形区域外的所有像素的颜色和深度都被屏蔽了,所以我们的绘制就不会影响到这些像素。这样操作操作比调用glClear来清除颜色和深度缓存要干净得多。

绘制中使用模板值

在了解了如何设置模板缓存后,使用模板缓存变得非常简单。你只需要通过一个测试函数来决定哪些像素需要绘制,然后将之前禁用的深度和颜色重新启用就可以了。

模板测试函数

如果你调用这个方法来设置了测试函数,只有模板缓存中值为1的像素能通过这个测试。一个像素只有在通过深度测试和模板测试后才能绘制,所以没有必要去设置glStencilOp。在例子中,只有那个矩形区域中的模板值被设置为1,所以只有在这个区域中的像素会被绘制。

设置掩码

一个小细节需要注意的是,我们在绘制我们的立方体时,仍会影响到模板缓存中的值,为了避免这种影响,我们将模板缓存的掩码设置为0。这样一来,我们以后的任何写入操作都会被屏蔽掉。

镜面反射的例子

现在我们在我们绘制的立方体下方加入一个反射镜面,首先在立方体的顶点数组中添加如下数据:

顶点数组

然后,在绘制立方体过后单独绘制这个镜面:

绘制镜面

现在我们创建一个反射效果,只需要将原有的立方体向下平移并相对Z轴翻转就行了:

创建反射

这里将反射面的颜色设置为黑色,这样就不会有纹理图片能够通过这个反射面。绘制效果如下:

平移旋转后的立方体

有两个值得一提的地方:

1:下方的立方体被反射面遮住是因为未能通过上一章我们提到的深度测试。

2:超出反射面范围的立方体依然能够被看见

第一个问题很好解决,只需要临时屏蔽掉向深度缓存写入值就可以了:

屏蔽深度缓存

第二个问题通过控制深度缓存似乎不好解决,我们需要屏蔽掉反射面范围之外的那些像素,所以我们的模板缓存就可以一展身手了!

我们可以将整个绘制过程细分为以下几个阶段,以便我们分析每个阶段应该做什么:

1.绘制上方的立方体

2.打开模板测试,再将我们需要绘制区域的模板值写成1。

3.绘制反射面

4.设置模板函数,让模板值为1的像素通过模板测试。

5.绘制一个颠倒的立方体。

6.关闭模板测试。

绘制代码如下:

镜面反射绘制代码

最后我们只需要将反射面上的图像灰化,这需要在我们的片段着色器中实现,overrideColor是用来灰化图案的颜色:

灰化反射图案

然后在绘制我们的反射立方体时传入一个灰度值,uniColor是glGetUniformLocation的返回值:

传入灰度值

大功告成!我们只用最基本的OpenGL的API就可以实现一个看似很复杂的效果,很神奇吧!

最终结果

作者:猿基地 链接:http://www.jianshu.com/p/bed926e53517 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

使用OpenGL实现模板缓冲区和剪切平面 综上所述,我们可以通过使用模板缓冲区和剪切平面来实现更高级的图形处理和控制。在上述代码示例中,我们展示了如何初始化OpenGL环境、清除模板缓冲区、设置模板缓冲区的值以及使用剪切平面来裁剪场景中的图形。在OpenGL中,模板缓冲区和剪切平面是两个重要的功能,它们能够在渲染过程中提供更高级的图形处理和控制。本文将介绍如何在OpenGL中使用模板缓冲区和剪切平面,并提供相应的代码示例。在渲染场景之前,我们需要启用剪切平面,并设置剪切平面的参数。在需要使用模板缓冲区的地方,我们可以设置模板缓冲区的值。 阅读详情

相关推荐

OpenGL使用模板缓冲区和剪切平面

OpenGL使用模板缓冲区和剪切平面先上图,再解答。完整主要的源代码源代码剖析 先上图,再解答。 完整主要的源代码 #include <stdio.h> #include "GL/glus.h" struct LightProperties { GLfloat direction[3]; GLfloat ambientColor[4]; GLfloat diffuseColor[4]; GLfloat specularColor[4]; }; struct M

希望我的博客,能帮上你解决学习中工作中所遇到的问题 553

OpenGL模板缓冲区---StencilBuffer

前言

Frank的专栏 2万+

2024年上市公司ESG评级全解析:六大权威数据源横向对比与应用指南

本文深度解析2024年国内主流ESG评级数据源,包括华证、商道融绿、Wind、富时罗素和彭博,横向对比其覆盖范围、评分逻辑与应用侧重点。文章提供实战指南,帮助投资者与企业根据投资决策、风险管理和学术研究等不同场景,精准选择并有效应用ESG数据,实现从概念到实用分析工具的转变。

weixin_29229055的博客 312

入门图形学:模板缓冲区/模板测试

最近因为家庭原因回老家了,在家里办了两三周杂七杂八的事情后,考虑是否继续去北上广深漂着(不得不说码农就是这个命啊)。家人和朋友让我在老家先呆着再说,于是准备了尝试找下工作。 前两天碰到面试官问了一个问题,就是关于模板缓冲区的原理,我只说了个大概而在细节上就卡壳了,因为我自己项目中实在很少用到这个,所以基本都搞忘了,今天晚上有点时间就回顾一下。 首先贴上这个以...

羊羊的博客 2828

线结构光三维重建(二):光平面标定与激光轮廓提取的实战优化

本文深入探讨了线结构光三维重建中的光平面标定与激光轮廓提取两大核心环节的实战优化。详细介绍了从棋盘格标定板法到自动化高鲁棒性标定的流程优化,并分享了针对复杂工业场景(如低对比度、高反光表面)的激光轮廓提取组合策略,旨在提升三维重建系统的整体精度与稳定性。

weixin_29057237的博客 331

VS Code配置MASM32汇编环境:从安装到调试的完整指南

本文提供了一份详尽的指南,教你如何在VS Code中配置MASM32汇编开发环境,实现从安装、环境变量设置到编写、编译和调试32位Windows汇编窗口程序的完整工作流。通过集成现代编辑器的便利性与经典汇编工具链,旨在降低学习门槛,提升底层开发效率。

nn3456的博客 483

十二、D3D12学习笔记——模板缓冲

我们认识了一下模板这个面具,你可以理解为他试图遮蔽什么,又或者是试图体现什么,重要的主要是分析首先逻辑,然后才是参数设置,剩下的就交给硬件自己实现了。

weixin_44212242的博客 803

C#实现跨域访问共享文件夹的账号密码验证方案

本文详细介绍了在C#中实现跨域访问共享文件夹的账号密码验证方案。通过调用Windows API LogonUser函数,结合LOGON32_LOGON_NEW_CREDENTIALS登录类型,可安全模拟指定用户身份,有效解决工作组与域环境间的文件共享访问难题。文章提供了完整的工具类封装、多种实战场景示例及详细的错误排查指南。

pea55的博客 540

对OpenGL中模板缓冲区解释

前段时间转载了一篇关于OpenGL的博客,但是并没有对里面的内容理解的很透彻,今天通过实例重新讲解一下。关于模板 缓冲区的基础知识参考上篇博客http://blog.youkuaiyun.com/yangyong0717/article/details/78313725。 对于模板缓冲区的值是如何设置的是一个关键问题,主要是借助于glStencilFuncSeparate()和glStencilOpSep

yangyongUestc的博客 667

CKS-CN考试之路----11

显然是alpine-b的镜像有libcrypto3-3.1.4-r5。新版本发布老版本会被回收,此时pod只剩下2个container。我们依次测试是哪个镜像里包含libcrypto3。可以看到alpine的pod有3个副本.

Q先生 652

基于YOLOv11的水果/商品/食堂/蔬菜/饮料/书籍识别与计价系统,前台+后台管理系统

基于YOLOv11的水果/商品/食堂/蔬菜/饮料/书籍识别与计价系统,前台+后台管理系统

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1219

OpenGL: 模板缓冲区的理解

引用:http://blog.163.com/danshiming@126/blog/static/109412748201632895137788/ 这几天看《OPenGL 编程指南》中的模板缓冲区,一头雾水,根本就没怎么理解,然后网上找了一些例子,先将自己理解的记录如下: 模板缓冲区(Stencil Buffer):与颜色缓冲区和深度缓冲区类似,模板缓冲区可以为屏幕上的每个像素点保

lizhen37031的博客 1219

把 NAST 变成你的遥控器:用 ABAP 程序精确触发与处理 Output Type

摘要 SAP中的Message Control机制通过NAST表记录输出状态,支持自动触发打印、邮件等操作。关键步骤包括: 构造NAST记录:定义输出类型、介质、处理状态等参数 调用处理函数:使用RV_MESSAGE_UPDATE_SINGLE更新表,通过WFMC_MESSAGES_PROCESS执行输出 典型应用场景: 单据补发(如PO邮件重发) 外部系统集成触发输出 故障恢复处理积压消息 注意事项: 需提交事务确保更新生效 区分S/4HANA新旧输出体系 正确处理派发时间(VSZTP)和状态(VSTAT

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 255

OpenGL缓冲区总结

帧缓冲区   几乎每个图形程序的重要目标之一都是在屏幕上绘制图形。屏幕是由一个矩形像素数组组成的,每个像素都可以在图像的某一个点上显示一个某种颜色的微小方块。在光栅化阶段(包括纹理和雾)之后,数据就不再是像素,而是片段。每个片段都具有与像素对应的坐标数据以及颜色值和深度值。   如果顺利通过了这些测试和操作,片段值便可以转换为像素。 如果顺利通过了这些测试和操作,片段值便可以转换为像素。为了绘

愿世界和平的IT劝退师 2630

从登录到应用可见:在 SAP S/4HANA Cloud Private Edition 中创建用户与打通 SAP Fiori 权限的完整思路

在SAP S/4HANA系统中,用户创建远非简单的账号开通,而是涉及认证、授权、数据访问等多维度的复杂过程。用户主数据记录(User Master Record)是系统访问的起点,包含登录方式、角色分配等关键信息。认证解决"你是谁"的问题,授权则决定"你能做什么"。SAP Fiori访问链路涉及Launchpad内容分配、应用启动映射、OData服务权限等多层校验。角色(Role)通过PFCG维护,包含业务目录(Catalog)和空间(Space)等元素,共同构成完整

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 149

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

WebGL 模板缓冲区

本文非原创,转载自 http://www.cnblogs.com/aokman/archive/2010/12/13/1904723.html 与颜色缓冲区和深度缓冲区类似,模板缓冲区可以为屏幕上的每个像素点保存一个无符号整数值。这个值的具体意义视程序的具体应用而定。在渲染的过程中,可以用这个值与一个预先设定的参考值相比较,根据比较的结果来决定是否更新相应的像素点的颜色值。这个比较的过程被称

程序员小站 3336

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

OpenGL模板缓冲区与模板测试

原文地址:http://www.blogjava.net/qileilove/archive/2014/01/23/409269.html 帧缓冲区有许多缓冲区构成,这些缓冲区大致分为:     颜色缓冲区:用于绘图的缓冲区,它包含了颜色索引或者RGBA颜色数据。      深度缓冲区:存储每个像素的深度值,当启动深度测试时,片段像素深度值和深度缓冲区深度值进行比较,决定片段哪些像素点数据可

蚂蚁的坚持 478

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

OpenGL学习二十九:模板缓冲区与模板测试

帧缓冲区有许多缓冲区构成,这些缓冲区大致分为:颜色缓冲区:用于绘图的缓冲区,它包含了颜色索引或者RGBA颜色数据。深度缓冲区:存储每个像素的深度值,当启动深度测试时,片段像素深度值和深度缓冲区深度值进行比较,决定片段哪些像素点数据可以替换到颜色缓冲区中。模板缓冲区:就像使用纸板和喷漆一样精确的混图一样,当启动模板测试时,通过模板测试的片段像素点会被替换到颜色缓冲区中,从而显示出来,未通过的则不...

Star 159

OpenGL: 模板缓冲区

相信大家有些人对OpenGL的模板缓冲区不是很理解,包括我最开始也是,OpenGL的模板缓冲区其实就是采用过滤的技术来控制那些颜色可以绘制,那些不能进行绘制。这里的过滤技术也就是我们的一个控制方法,主要体现在如下两个函数glStencilFunc(GLenum func,GLint ref,GLuint mask)和glStencilOp(GLenum fail,GLenum zfail, G

能搬的绝不自己写 819

计算机图形学理论(4):缓冲区

缓冲区是保存某些数据的临时存储空间。为什么我们需要缓冲区?原因很简单,当数据量很大时,因为计算机无法同时处理整个数据,因此在处理当前数据集时需要额外的空间来存储其余数据。在计算机图形学中,缓冲区有多种定义方式。分辨率:宽度(n) x 高度(m)深度(或精度):k位数/像素例如,如果我们想要每个像素使用 RGB 通道,则一个通道需要 8 位,总共 24 位(3 x 8 位)。

1774

【OpenGL】glClear函数的使用

函数原型:       void glClear(GLbitfield mask); 参数说明:       GLbitfield:可以使用 | 运算符组合不同的缓冲标志位,表明需要清除的缓冲,例如glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)表示要清除颜色缓冲以及深度缓冲,可以使用以下标志位       GL_COLO

四月晴 1万+

OpenGL函数思考-glClear

函数原型:       void glClear(GLbitfield mask); 参数说明:       GLbitfield:可以使用 | 运算符组合不同的缓冲标志位,表明需要清除的缓冲,例如glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)表示要清除颜色缓冲以及深度缓冲,可以使用以下标志位       GL_COLO

... 890

初学opengl

1、void  glclearColor(GLclampf )

u010626702的专栏 639

用OpenSceneGraph实现的NeHe OpenGL教程 - 第二十六课

简介 这节课主要介绍了如何使用OpenGL中的模板缓冲区和裁剪平面来

Frank的专栏 2384
上一篇: 20分钟让你了解OpenGL——OpenGL全流程详细解读
下一篇: [osgearth]OE地形平整代码解读
pplander
博客等级 码龄20年 111粉丝 12原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值