OpenGL学习日志之模板测试

news2024/9/20 0:59:43

模板测试(Stencil Test)出现原因

深度测试更多是为了解决如何区分物体前后遮挡关系,从而选择丢弃片段的测试。而模板测试,是通过设置片元模板缓冲区模板值和引用模板值,再按照我们设定的运算函数来丢弃某些片段,从而来达到我们想要的一些效果。是一种在深度测试之前丢弃片元的一个辅助方法,是为了达到我们预定的一些效果而添加的一个测试手段。

模板测试(Stencil Test)的位置

模板测试是在透明度测试之后,深度测试之前进行的,模板测试也有一个自己的缓冲区,叫做模板缓冲区。它和颜色缓冲区,深度缓冲区类似,模板缓冲区的模板值通常是8bit(一个字节),因此每个片段的模板值的范围是0-255。模板测试根据模板缓冲区中片段的模板值与设置的引用值,进行我们设置的运算式进行比较,如果没有通过测试,则丢弃该片段。
在这里插入图片描述

模板测试(Stencil Test)

openGL中开启模板测试

glEnable(GL_STENCIL_TEST);

清除缓冲区
一旦启用模板测试,在每一次渲染以前,我们需要像清空颜色缓冲区和深度缓冲区一样,清空模板缓冲区。

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

通过模板函数,设置运算符和模板引用值

void glStencilFunc(GLenum func, GLint ref, GLuint mask)

//简单例子:它会告诉OpenGL,无论何时,一个片段模板值等于引用值1,片段就能通过测试被绘制了,否则就会被丢弃
glStencilFunc(GL_EQUAL, 1, 0xFF)

func:设置模板测试运算符,可用的选项是:GL_NEVER、GL_LEQUAL、GL_GREATER、GL_GEQUAL、GL_EQUAL、
GL_NOTEQUAL、GL_ALWAYS。它们的语义和深度缓冲的相似。

操作描述
GL_NEVER永远不通过测试
GL_ALWAYS永远通过测试
GL_LEQUAL模板值小于等于引用值时通过测试
GL_GEQUAL模板值大于等于引用值时用过测试
GL_EQUAL模板值等于引用值的时通过测试
GL_GREATER模板值大于引用值时通过测试
GL_NOTEQUAL模板值不等于引用值时通过测试

ref:引用值,用于和模板缓冲的模板值做运算比较的
mask:模板值在比较以前位遮罩,即模板值在和引用值ref做运算比较以前,需要先与mask遮罩值进行按位与,然后与后的结果再进行和引用值比较,一般设置0xFF

设置模板缓冲是否可写
OpenGL是通过设置位遮罩来控制写操作的,当我们在准备写入模板值之前,我们会将模板值与这个位遮罩进行与运算,一般我们使用0xFF和0x00就行,如果你有特殊的需求需要控制某一位的写入和其他不一样,你也可以自己设置。

//此时,模板值与它进行按位与运算结果是模板值,模板缓冲可写
glStencilMask(0xFF); 

//此时,模板值与它进行按位与运算结果是0,模板缓冲不可写
glStencilMask(0x00); 

如何更新缓冲区
与更新深度缓冲区不同,当通过了测试,并且缓冲区设置为可写模式,我们仍然可以设置如何更新模板缓冲区,以及什么时候更新缓冲区,具有更大的自由度。通过glStencilOp函数。

void glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass)

sfail:如果模板测试失败将采取的动作
dpfail:如果模板测试通过,但是深度测试失败时采取的动作
dppass:如果深度测试和模板测试都通过,将采取的动作

每个选项可以有以下几种动作

操作描述
GL_KEEP保持现有的模板值
GL_ZERO将模板值设置为0
GL_REPLACE将模板值设置为ref引用值
GL_INCR如果模板值不是最大值,则模板值+1
GL_INCR_WRAP与GL_INCR一样将模板值+1,如果模板值已经是最大值则设为0
GL_DECR如果模板值不是最小值就将模板值-1
GL_DECR_WRAP与GL_DECR一样将模板值-1,如果模板值已经是最小值则设为最大值
GL_INVERT按位反转当前模板缓冲区值

示列代码:代表任何测试的任何结果,模板缓冲都会保留它的值。默认行为不会更新模板缓冲。

glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP)

模板测试应用1–物体轮廓

在这里插入图片描述
大概步骤是

第一步

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
    glEnable(GL_STENCIL_TEST);
    glStencilFunc(GL_ALWAYS, 1, 0xFF); //所有片段都要写入模板缓冲
    glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);

开启深度测试 ,开启深度写入,设置深度运算为GL_LESS,即片元深度值<深度缓冲值通过测试
开启模板测试,设置模板运算函数为,所有片段都通过
写入模板缓冲为当通过深度测试且通过模板测试,用ref引用值1替换模板缓冲区

第二步
普通绘制正方形1
普通绘制正方形2
绘制完以后
此时能通过深度测试,绘制出来的片元,模板值都为1。

        glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
        glStencilMask(0x00);
        glDisable(GL_DEPTH_TEST);

深度测试依旧开启,但关闭深度写入
模板测试依旧开启,但关闭模板写入
设置模板值为不等于1则通过
绘制放大一点的正方形1
绘制放大一点的正方形2

由于原本绘制的正方形区域片元模板值都为1,而我们设置的模板值不等于1通过,因此放大的正方形绘制时,只有大于原本大小的正方形的片元片段才能通过模板测试,也就是我们拿来作为描边的部分。

第三步
绘制完成以后,重新开启深度写入和模板写入

        glStencilMask(0xFF);
        glEnable(GL_DEPTH_TEST);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/489153.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTB-Brainfuck

HTB-Brainfuck 信息收集443端口https://sup3rs3cr3t.brainfuck.htb/https://brainfuck.htb/和www.brainfuck.htb 立足读取root.txt内容oresits -> root 信息收集 443端口 查看对应证书。 从证书中能获得 Email Address&#xff1a; orestisbrainfuck.htbCommon Name&#…

解决echarts 在缩放中模糊的问题

echarts 在缩放中模糊的问题 参考&#xff1a;缩放带来的echarts模糊 1、echarts.init(dom,null,{ renderer : svg }); 2、echarts.init(chart,null, { devicePixelRatio: 2 });问题&#xff1a;在使用dom-to-image插件截图的情况下&#xff1a; 1、使用方式一 { renderer : …

Jetson Nano emmc版本系统镜像备份和烧录

一、镜像备份 1&#xff0e;将待复制的jetson设备进入恢复模式&#xff0c;用数据线连接jetson设备和主机。 对于原厂开发板将FC_REC引脚与GND短接&#xff0c;通过micro-usb到usb数据线连接到电脑。 在电脑的ubuntu通过lsusb命令查看需要备份的设备是否已经接入&#xff0c…

vue3.x + vite4.3构建属于自己的组件库并发布npm包

在国内的项目研发过程中&#xff0c;使用vue框架的项目占比很大&#xff0c;同样延伸出了很多非常优秀的UI组件库&#xff0c;比如element-plus、ant-design等&#xff1b;优势&#xff1a;资源较少&#xff0c;快速开发&#xff0c;丰富的API&#xff0c;阅读性、性能优化更好…

医疗实验室信息管理系统源码(云LIS)

云LIS系统源码是一种医疗实验室信息管理系统&#xff0c;提供全面的实验室信息管理解决方案。它的主要功能包括样本管理、检测流程管理、报告管理、质量控制、数据分析和仪器管理等。 云LIS源码技术说明&#xff1a; 技术架构&#xff1a;Asp.NET CORE 3.1 MVC SQLserver Re…

Spring:使用注解进行Spring开发(@Component、@Configuration、@ComponentScan、@Autowired等)

Component、Configuration、ComponentScan、Autowired、Scope、Value、Resource、Bean、Qualifier、PropertySource等注解 1. 注解和配置文件applicationContext.xml配合使用 现在有一个接口类Book3Dao、和其实现类Book3DaoImpl&#xff0c;利用注解和配置文件在测试类上调用其…

【Linux网络】网络应用层的 http 和 https协议

文章目录 1、http协议1.1 认识URL1.2 http协议格式1.3 http的方法&#xff08;GET和POST&#xff09;1.4 状态码1.5 cookie1.6 短连接和长连接 2、https协议2.1 常见的加密方式2.2 探究https协议的加密2.3 CA证书 1、http协议 在之前学习序列化和反序列化的时候&#xff0c;认…

Linux 之 vi 文本编辑器(二)

1、文本编辑器简介 Linux 中最常用的文本编辑器&#xff1a; vi&#xff1a;类 Unix 系统中默认的文本编辑器 vim&#xff1a;vi 编辑器的增强版本&#xff0c;习惯上也称 vi vi 文本编辑器的作用和特性&#xff1a; vi 可以执行插入、删除、查找、替换等众多文本操作&…

网络计算模式复习(四)

MapReduce MapReduce分布式处理技术、分布式的文件系统GFS、结构化的BigTable存储系统是Google的三个核心技术。 Map-Reduce&#xff1a;用于大规模数据集的并行计算。 &#xff08;分而治之&#xff09;将要执行的问题拆解成Map&#xff08;映射&#xff09;和Reduce&#x…

SpringBoot整合FreeMarker

一、FreeMarker简述 在线文档&#xff1a;http://freemarker.foofun.cn/ FreeMarker 也是一款模板引擎技术&#xff0c;它是一种基于模板和要改变的数据&#xff0c;并用来生成输出文本(HTML网页&#xff0c;电子邮件&#xff0c;配置文件&#xff0c;源代码等)的通用工具。当然…

创建一个react项目

文章目录 1&#xff1a;命令行输入2&#xff1a;在vs的终端中输入npm start 来启动项目3&#xff1a;删除src目录中的干扰项4&#xff1a;去掉index.js中的严格模式节点JSX介绍JSX中使用js表达式原生js调用三元运算符列表渲染条件渲染三元表达式逻辑&&运算 分支逻辑类名…

Setting up SSH Host ...问题解决

一、问题可能原因&#xff1a; 网速问题导致下载过慢&#xff0c;超时 二、解决方式&#xff1a;手动下载安装 1、确定VSCode commit id&#xff0c;如下图所示 2、拼接请求&#xff0c;下载vscode server包 Arm&#xff1a;https://update.code.visualstudio.com/commit:换…

【AUTOSAR】【通信安全】CRC

目录 一、概述 二、功能说明 2.1 通用行为 2.2 8位CRC计算 2.2.1 8位SAE J1850 CRC计算 2.2.2 8位0x2F多项式CRC计算 2.3 16位CRC计算 2.3.1 16位CCITT-FALSE CRC16 2.3.2 16位0x8005多项式CRC计算 2.4 32位CRC计算 2.4.1 32位以太网CRC计算 2.4.2 32位0xF4ACFB13多…

AIGC产业研究报告 2023——图像生成篇

易观&#xff1a;今年以来&#xff0c;随着人工智能技术不断实现突破迭代&#xff0c;生成式AI的话题多次成为热门&#xff0c;而人工智能内容生成&#xff08;AIGC&#xff09;的产业发展、市场反应与相应监管要求也受到了广泛关注。为了更好地探寻其在各行业落地应用的可行性…

jvm之常用命令行工具

写在前面 本文已起看下给我们的Java程序看病常用到的工具都有哪些&#xff0c;通过工具得到指标&#xff0c;通过指标分析病情&#xff0c;从而给出对应的治疗方案。 1&#xff1a;jps/jinfo 用来获取运行的jvm进程信息&#xff0c;一般我们使用该命令来获取进程号&#xff…

CTF权威指南 笔记 -第二章二进制文件- 2.4 -动态链接

目录 静态文件的缺点 动态链接 位置无关代码 延迟绑定 _dl_runtime_reslove 函数定义 深入审视 静态文件的缺点 随着可执行文件的增加 静态链接带来的浪费空间问题就会愈发严重 如果大部分可执行文件都需要glibc 那么在链接的时候就需要把 libc.a链接进去 如果一个libc…

Spark大数据处理讲课笔记3.6 RDD容错机制

文章目录 零、本讲学习目标一、RDD容错机制&#xff08;一&#xff09;血统方式&#xff08;二&#xff09;设置检查点方式 二、RDD检查点&#xff08;一&#xff09;RDD检查点机制&#xff08;二&#xff09;与RDD持久化的区别&#xff08;三&#xff09;RDD检查点案例演示 三…

Matlab 多项式拟合

一、线性 1、多项式 corrcoef函数 corrcoef函数用来计算矩阵相关系数。 (1)、corrcoef(x)&#xff1a;若x为一个矩阵&#xff0c;返回的则是一个相关系数矩阵。 (2)、corrcoef(x,y)&#xff1a;计算列向量x、y的相关系数&#xff0c;要求x、y具有相等的元素个数。如果x、y是矩…

2023河南土著双非硕士——毕业季秋招春招就业经验分享(仅限于在河南找工作,毕业想留河南)

作为一名河南土生土长的人&#xff0c;本硕皆就读于河南某双非一本&#xff0c;是一个实打实的河南土著&#xff0c;河南作为互联网就业的贫困环境&#xff0c;相较于CSDN博客上那么多动不动就腾讯、阿里、字节等大厂的就业经验分享&#xff0c;我更想分享一下我在河南省内找工…

百度文心一言正式亮相,数说故事受邀成为首批内测企业

3月16日下午&#xff0c;百度在北京召开新闻发布会&#xff0c;正式推出基于百度新一代大语言模型的生成式AI产品——文心一言&#xff0c;百度创始人、董事长兼首席执行官李彦宏现场展示了文心一言在文学创作、商业文案创作、数理推算、中文理解、多模态生成五个使用场景中的综…