OpenGL使用模板模板缓冲时需要注意的几个问题

OpenGL之帧缓冲 本文主要包括帧缓冲的基本概念、函数使用,以及引出离屏渲染和后处理的介绍。 文章目录概要帧缓冲附件函数纹理附件渲染缓冲对象附件附件类型的选择后处理离屏渲染离屏渲染与双缓冲来源 概要 所谓帧缓冲是做什么用的,就是用来存储渲染数据的地方,可以理解为显存。几何数据(顶点坐标、纹理坐标等)和纹理经过一系列渲染管道最终计算出屏幕上的所有像素点,它们需要一个地方来存放,这个地方就是帧缓冲。帧缓冲中的数据会被显示... 阅读详情

也许你使用过模板缓冲区,但是你真正懂得它的正确用法吗? 
   本人根据实践总结出下面几个问题,希望对大家能有所帮助:

   1. 使用模板缓冲区的步骤

    2.glStencilFunc中的参数意义,及如何选择合理参数?

   3.glStencilOp中的参数意义及选用.

  ====================================================================

  问题1:

   简而言之:

           1)指定默认模板值,用其清除模板缓冲区,

           2)开启模板测试功能,  指定模板比较函数, 指定模板测试失败后对相应位置的模板值的操作方式.

          3)用绘图命令绘制一个模板图形

         4) 绘制其他图形

         下面详细叙述:

   如果你要使用一个模板缓冲区,那么首先你要在使用之前象清除颜色缓冲区一样,把原来缓冲区里的无效数据给清理干净,这就是在调用glClear() 时 加上GL_STENCIL_BUFFER_BIT. 也就是象这样:

    glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)

  与颜色缓冲区类似,你在使用这个函数之前也要指定一个默认填充值, 你可以这样指定 glClearStencil(0);

当然你不一定要用0,就像你清除颜色缓冲区时不一定要指定glClearColor(0,0,0).一样,你要根据你的需要来设定.

   设定好默认值后,并用这个默认值将模板模板缓冲区填满以后,你就可以在你需要的地方开始使用它了:

   glEnable(GL_STENCIL_TEST);

  接下来我们要生成我们的模板,实际上就是通过一组绘图命令,来绘出一个图像,把它当作模板. 比如我们要生成一个镂空的花窗,那么我们可以把这个花窗需要空的部分绘出来,当作模板,使得在进行后续绘图时,落到这个模板上的图像不被绘制,就形成了镂空..   好了,扯远了, 这只是告诉你什么叫模板....... 呵呵,好像没这个必要???

  因为我们在创造我们的模板时使用的也是绘图命令,有时候,我们并不想让这个模板本身被别人看见, (一个图形要被看见 等于 它被写入颜色缓冲并最终被交换到屏幕上来)..为了不让这些创建模板的代码被显示为图形,我们需要禁止颜色缓冲的写入, 这可以通过下面的语句做到

   glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE); 它使所有的颜色通道都不可以写入

 同理,如果我们不希望绘制模板的代码影响深度缓冲区,那么我们可以调用 glDisable(GL_DEPTH_TEST); 来禁止深度缓存的写入.

  设置好这些后,我们准备开始绘制模板,

  绘制模板之前, 我们需要给模板本身所绘制的图形指定一个模板值,为什么呢? 因为模板测试类似与深度测试, 它是通过把已有的模板缓冲区的值,与将要绘制的图形的模板值相比较,然后只绘制使得比较结果为真的那些图像...

  现在模板缓冲区里面全是默认值,那么我们需要给模板本身指定一个值,那么在以后进行绘制时,就可以拿要绘制的图像的模板值与这个值做比较从而进行取舍了...

  而怎么样给绘制的图像赋上模板值,并进行比较呢? 这就是通过2,3 问题中所述的两个函数来进行,  请接着往下看...

问题2.    glStencilFunc 用法

  glStencilFunc的原形是: glStencilFunc( GLenum func, GLint ref, GLuint mask);

  它的作用就是来指定 模板测试 的比较函数, 这些函数用来将   "当前绘制图像的模板值" 与 "要写入位置的模板值" 进行比较 以得到一个Ture Or False 值 , 这个比较函数由第一个参数指定,它是一个 枚举值,可选的有 GL_GREATER ,GL_LESS 等,  第二个就是紧跟着这个函数的绘图函数所绘图形,的模板值, 它用来与要绘制的目标位置的模板值,用第一个参数指定的函数进行比较,得到结果..   但是这种比较并不是直接拿这两个值去比, 假如要绘制的目标位置的模板值是B,第二个参数指定的是A, 那么比较是这样进行的, 先将 A与第三个参数 mask 进行AND操作  并同时将 B与mask 进行与操作,然后按指定的比较函数func比较结果 ,

     也就是 ((ref & mask) op (svalue & mask))

   如果A 与B的比较结构为真,则写入,假则不写入...

问题3: glStencilOp用法

  glStencilOp() 函数的原形为: glStencilOp(GLenum fail , GLenum zfail, GLenum zPss );

 它的作用是用来指定,当某些图元在绘制的时候,如果模板测试失败(或者深度测试失败),它怎么修改其打算写入的位置的模板值. 它的三个参数 分别指定了,当模板测试失败了 该如何修改, 深度测试失败了如何修改,以及 深度测试如果成功又该怎么修改....  后面两个参数也就是说,就算模板测试通过,我们也可以通过深度测试的测试结果修改模板值..

  它们的可选值为: GL_KEEP(保持不变), GL_DEC(减少) , GL_INCR(增加) ,GL_REPLACE(替换),

  特别需要注意的是: 这些操作在每个面片被写入的时候都会进行,如果你使用GL_INCR , 可能你只绘制了一个模型,但是,这个模型有几个面片在深度上重叠,那么在每次写入这些面片时,都会引起一次GL_INCR, 也就是模板值 +1 , 如果你不曾注意到这个问题,那么你在测试函数glStencilFunc 中时选用 GL_EQUAL 就会得到不正确的结果..   如果你需要使用GL_EQUAL 建议你在本函数中选用 GL_REPLACE ,这个变量引起函数用 glStencilFunc  中指定的 ref 值来替代 当前要绘制位置的模板值, 这样多次操作不会有影响....

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/doing5552/archive/2008/04/16/2297280.aspx

OpenGL学习脚印:模板测试(stencil testing) 写在前面 上一节介绍了深度测试,本节继续学习一个高级主题-模板测试(stencil testing)。模板缓冲同之前介绍的颜色缓冲、深度缓冲类似,通过它我们可以实现很多的特效,例如轮廓、镜面效果,阴影效果等。本节示例程序均可以从我的github下载。通过本节可以了解到 模板缓冲的作用 模板缓冲的使用方法-简单的矩形模板 模板缓冲实现的outline和refleciton效果 模板缓冲的作用上一节介 阅读详情

相关推荐

OpenGL进阶(一)之帧缓冲FrameBuffer

帧缓冲(Framebuffer),它被储存在显存中,包括:用于写入颜色值的、用于写入深度信息的和允许我们根据一些条件丢弃特定片段的。我们目前在前边入门文章中所做的所有操作都是在的渲染缓冲上进行的。默认的帧缓冲是在你创建窗口的时候生成和配置的(GLFW帮我们做了这些)!由于我们的帧缓冲不是默认帧缓冲,渲染指令将不会对窗口的视觉输出有任何影响,这个过程也被称为。

苦逼的程序猿☺ 5034

GLES2.0中文API-glGet

名称 glGet - 返回所选参数的值 C规范 void glGetBooleanv(    GLenum pname,      GLboolean * params); void glGetFloatv(    GLenum pname,      GLfloat * params); void glGetIntegerv(    GLenum pname,      GLint *...

flycatdeng的专栏 3316

OpenGL学习脚印: 帧缓冲对象(Frame Buffer Object)

写在前面 一直以来,我们在使用OpenGL渲染时,最终的目的地是默认的帧缓冲区,实际上OpenGL也允许我们创建自定义的帧缓冲区。使用自定义的帧缓冲区,可以实现镜面,离屏渲染,以及很酷的后处理效果。本节将学习帧缓存的使用,文中示例代码均可以在我的github下载。 本节内容整理自 1.OpenGL Frame Buffer Object (FBO) 2.www.learn

王定桥的专栏 1万+

使用模板模板缓冲时需要注意的几个问题

也许你使用过模板缓冲区,但是你真正懂得它的正确用法吗?    本人根据实践总结出下面几个问题,希望对大家能有所帮助:   1. 使用模板缓冲区的步骤    2.glStencilFunc中的参数意义,及如何选择合理参数?   3.glStencilOp中的参数意义及选用.  ======================================================

TurtleRock 526

openGL模板测试遇到的问题

运行openGL入门教程中,模板测试程序,核心代码如下: void draw_sphere() {     // 设置光源     glEnable(GL_LIGHTING);     glEnable(GL_LIGHT0);     {         GLfloat             pos[]     = {5.0f, 5.0f, 0.0f, 1.0f},

1032

opengl 模板测试下的镜子效果

使用openGL的模板测试,简单的镜子反射水壶的例子

第一章 OpenGL概述

第一章 OpenGL概述 1.4 OpenGL渲染管线 openGL管线 1.5 第一个程序:深入分析 初始化顶点数组对象 顶点数组对象负责保存一系列顶点的数据,数据保存在顶点缓存对象中,并由当前绑定的顶点数组对象管理。 分配顶点数组对象 void glGenVertexArrays(GLsizei n, GLunit* arrays) 返回n个未使用的对象名到数组arrays当中,用作顶点数...

lele0503的博客 414

OPENGL 镜面效果源代码

计算机图形学opengl 模板缓存镜面效果 基于ios,xcode开发

OpenGL ES之glEnable和glDisable函数

名称: glEnable/glDisable —— 开启和关闭服务器端GL功能 函数原型: void glEnable(GLenum cap); void glDisable(GLenum cap); 函数参数: cap     指明一个GL功能的标识符。 描述:         glEnable/glDisable可

飞鱼 1万+

echarts 生成中国陕西省份(或其他省份)的地图,大屏使用

效果图: 一、首先第一步需要下载echarts和获取到陕西身份的地图信息。 1.下载echarts链接(官网): Apache ECharts 2.生成指定省份的地图数据信息,数据可以在阿里云获取。 DataV.GeoAtlas地理小工具系列 如图,点击左圈需要的省份,这里我选择的是陕西省,然后点击右圈复制下载链接,得到一个json格式的数据,可以在json转换网站转成js格式。 Json在线解析格式化-Json在线校验Json格式化压缩-Jsons在线工具 转成js格.

PrimaryColor 3890

FPGA实战:用DDR3和乒乓操作解决视频帧撕裂问题(附Verilog代码)

本文详细介绍了如何利用DDR3内存和乒乓操作架构解决FPGA视频处理中的帧撕裂问题。通过多帧缓存原理、AXI接口配置和自适应乒乓操作设计,有效隔离读写操作,确保视频流稳定传输。文章包含Verilog代码实现和性能优化技巧,适用于工业相机、医疗影像等高速视频处理场景。

m2n3b4v5c6的博客 289

OpenGL中的混合 (blend)

    Blend 混合是将源色和目标色以某种方式混合生成特效的技术。混合常用来绘制透明或半透明的物体。在混合中起关键作用的α值实际上是将源色和目标色按给定比率进行混合,以达到不同程度的透明。α值为0则完全透明,α值为1则完全不透明。混合操作只能在RGBA模式下进行,颜色索引模式下无法指定α值。物体的绘制顺序会影响到OpenGL的混合处理。 glEnable( GL_BLEND );

沙漠黑鸟的专栏 2万+

S7-1200与KINCO伺服通信实战:CM CANopen模块配置避坑指南(附完整PDO映射表)

本文详细解析了西门子S7-1200 PLC通过CM CANopen模块与KINCO伺服驱动器的通信配置全流程,重点解决PDO映射混乱、心跳报文配置错误等常见问题。提供硬件组态、参数设置、PDO映射模板及故障排查方案,助力工业自动化系统实现稳定高效的多轴运动控制。

2y3u4i5o6p的博客 1101

OpenGL使用模板模板缓冲时需要注意的几个问题 .

也许你使用过模板缓冲区,但是你真正懂得它的正确用法吗?    本人根据实践总结出下面几个问题,希望对大家能有所帮助:    1. 使用模板缓冲区的步骤     2.glStencilFunc中的参数意义,及如何选择合理参数?    3.glStencilOp中的参数意义及选用.   ====================================================

依文依叶 666

[Dify] 如何在Dify中解析上传的TXT文件内容

在Dify平台上构建智能应用时,解析用户上传的.txt文件是关键步骤。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 2637

Python爬虫实战:基于最新技术栈的政府招标采购数据抓取与分析

对于企业、研究人员和数据分析师来说,能够高效地获取这些数据意味着可以获得宝贵的商业洞察和市场先机。随着反爬技术的不断升级和网站结构的日益复杂,传统的爬虫方法已经难以满足需求。我们将采用Selenium、Playwright等现代浏览器自动化工具,结合Scrapy框架和异步请求库,构建一个能够应对各种反爬措施的强大爬虫系统。Playwright是微软开发的浏览器自动化工具,支持Chromium、WebKit和Firefox,比Selenium更快速、更稳定。

2201_76125261的博客 1312

使用模板缓冲区时需要注意的几个问题

 使用模板模板缓冲时需要注意的几个问题-----作者:  熊 斌       2007.12.30         xiongbincsu@yahoo.com.cn   也许你使用过模板缓冲区,但是你真正懂得它的正确用法吗?   本人根据实践总结出下面几个问题,希望对大家能有所帮助:   1. 使用模板缓冲区的步骤    2.glStencilFunc中的参数意义,及如何选

OpenGL 技术 4496

【5】GD32H7xx CAN发送及FIFO接收

GD32H7xx CAN收发调试记录,包含源码

madao1234的博客 1816

OpenGL之帧缓冲详解

简介 OpenGlES中的物体绘制并不是直接在屏幕上进行的,而是预先在帧缓冲区内进行绘制的,每绘制完一帧再将绘制的结果交换到屏幕上,所以每次绘制新的一帧时,都要清除缓冲区中的相关数据,否则可能产生不正确的绘制。 包括三种类型的屏幕缓冲 颜色缓冲 用于存储每个片元的颜色值,每个颜色包括RGBA4个色彩通道,应用程序看到的内容就是颜色缓冲区中的内容 用于写入深度信息的深度缓冲 用于存储每个片元的深度值,是指从片元处到观察点(相机)的距离。在启用深度测试的情况下,新片元想进入帧缓冲时需要将自己的深度值与帧缓冲.

ArvinFei的博客 3248

智能驾驶辅助系统(ADAS)全解析:功能详解 + 技术原理 + 实战案例

智能驾驶辅助系统(ADAS)是现代汽车技术的重要组成部分,旨在提升驾驶安全性和便利性。本文详细解析了ADAS的多个功能模块,包括自适应巡航控制(ACC)、车道偏离预警/车道保持辅助(LDW/LKA)、前向碰撞预警/自动紧急制动(FCW/AEB)、盲区检测/变道辅助(BSD/BSM)、倒车影像、自动泊车辅助(APA)、交通标志识别(TSR)、自动远光控制(AHB)、后方交叉来车预警(RCTA)和驾驶员疲劳监测。每个功能模块都基于特定的技术原理,如毫米波雷达、摄像头、传感器融合和深度学习算法,以实现对车辆周围环

weixin_43199439的博客 2103

【图像超分】论文复现:轻量化超分 | 残差特征蒸馏网络RFDN的Pytorch源码复现,跑通源码,整合到EDSR-PyTorch中进行训练,补充CCA的实现!

本文介绍了将RFDN(残差特征蒸馏网络)整合到EDSR-PyTorch框架中的实现过程。主要内容包括:1)环境配置与数据集准备;2)测试源码提供的x4预训练模型,并通过修改图像裁剪函数解决HR与SR尺寸不一致问题;3)训练过程详解,包括将RFDN源码模块整合到EDSR框架中,调整模型参数输入方式。文章还提供了完整的代码实现、训练好的模型权重下载链接,并对RFDN架构进行了详细拆解与注释。通过将RFDN与EDSR相结合,实现了轻量级图像超分辨率重建,获得了PSNR/SSIM等指标及可视化结果。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 433

OpenGL 模板缓冲区stencil到底如何使用?

在写模板缓冲OpenGL相关的API时,看了半天帖子都没有搞清楚模板缓冲区到底是什么时候写入值的。下面总结一下。

qq_38183694的博客 757

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

android OpenGL ES详解——双缓冲区、默认缓冲区和帧缓冲区

在Android OpenGL中,双缓冲、默认缓冲和自定义帧缓冲(Frame Buffer Object,FBO)是图形渲染中的重要概念,它们各自承担着不同的角色和功能,同时又相互关联。双缓冲双缓冲是图形渲染中的一种常用技术,它使用两个缓冲区来存储图像数据。在OpenGL窗口中,通常有一个前缓冲(Front Buffer)和一个后缓冲(Back Buffer)。前缓冲是用户当前看到的图像,而后缓冲则是下一帧将要显示的图像。当一帧图像渲染完成后,后缓冲和前缓冲会进行交换,这样用户就能看到新的图像。

闲暇部落 2303

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

OpenGL学习之帧缓冲——FBO

介绍 在之前的绘图过程中,我们没有注意到所绘制的颜色信息、深度信息、模板信息写到哪里去了?实际上,GLFW为我们做了完了这件事,渲染得到的信息存储到了系统默认帧缓冲(window-system-provided framebuffer)当中了。帧缓冲——framebuffer是OpenGL管线最后“一站”,它存储一系列的2D序列,最后在glfwSwapBuffers操作中将这些信息转换为屏幕上的...

u011371324的专栏 3188

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: opengl有用博客
下一篇: 黑客
vampirem
博客等级 码龄14年 20粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值