QT之OpenGL模板测试

news2024/11/28 4:53:18

QT之OpenGL模板测试

  • 1. 概述
  • 2. 使用步骤及函数介绍
  • 3. Demo
  • 4. 参考

1. 概述

当片段着色器处理完一个片段之后,模板测试(Stencil Test)会开始执行,和深度测试一样,它可能会丢弃片段。被保留下来的片段会进入深度测试。

一个模板缓冲中,(通常)每个模板值(Stencil Value)是8位的。所以每个像素/片段一共能有256种不同的模板值。我们可以将这些模板值设置为我们想要的值,然后当某一个片段有某一个模板值的时候,我们就可以选择丢弃或是保留这个片段了。

模板缓冲示意图:
在这里插入图片描述
模板缓冲中1的部分最后会被渲染出来,最终效果为一个

2. 使用步骤及函数介绍

  • 开启模板缓冲
glEnable(GL_STENCIL_TEST);
  • 每一帧时清空模板缓冲
// GL_STENCIL_BUFFER_BIT 这个就表示要清除模板缓冲
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
  • 设置模板缓冲掩码
// 这里的掩码是表示允不允许向模板缓冲中写入数据
glStencilMask(0xFF); // 允许所有位写入
glStencilMask(0x00); // 不允许所有位写入
  • 模板函数
/*
这个函数仅仅告诉OpenGL应该对模板缓冲中的内容做什么行为的操作,而不是应该如何更新缓冲
func:指定具体的行为 GL_NEVER、GL_LESS、GL_LEQUAL、GL_GREATER、GL_GEQUAL、GL_EQUAL、GL_NOTEQUAL和GL_ALWAYS
ref:表示func行为的参考值,如GL_EQUAL 则表示模板缓冲中的值等于 ref 时进行绘制,否则丢弃
mask:设置屏蔽位的,它会将ref值和模板缓冲中的值进行与运算后再使其比较,默认为0xFF
*/
glStencilFunc(GLenum func, GLint ref, GLuint mask)

/*
这个函数则指定应该如何更新模板缓冲的值,默认情况下均为 GL_KEEP
sfail:模板测试失败时应该如何更新缓冲区
dpfail:模板测试通过时应该如何更新缓冲区
dppass:模板测试和深度测试都通过时采取的行为

参数具体可以设定的值:
GL_KEEP	保持当前储存的模板值
GL_ZERO	将模板值设置为0
GL_REPLACE	将模板值设置为glStencilFunc函数设置的ref值
GL_INCR	如果模板值小于最大值则将模板值加1
GL_INCR_WRAP	与GL_INCR一样,但如果模板值超过了最大值则归零
GL_DECR	如果模板值大于最小值则将模板值减1
GL_DECR_WRAP	与GL_DECR一样,但如果模板值小于0则将其设置为最大值
GL_INVERT	按位翻转当前的模板缓冲值
*/
glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass)

3. Demo

Demo中模仿OpenGL中的模型增加外边框的操作,核心步骤:

  1. 开启模板测试
    glEnable(GL_STENCIL_TEST);
    
  2. 指定如何更新模板缓冲区的值
    glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
    
  3. 每帧情况模板测试缓冲并设置缓冲只读
    // 使用
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    // 不允许向模板缓冲区写入值
    glStencilMask(0x00);
    
  4. 第一次绘制模型前,设置对缓冲区进行的操作
    // 告诉OpenGL应该对模板缓冲中所有片段进行绘制,同时在通过模板测试及深度测试后模板缓冲区的内容会被替换成1(被替换的操作是由glStencilOp指定的,替换的值则是由glStencilFunc给定)
    glStencilFunc(GL_ALWAYS, 1, 0xFF);
    // 允许向模板缓冲区写入值
    glStencilMask(0xFF);
    
  5. 指定第二次绘制时对缓冲区的操作
    // 绘制不等于1的区域,由于第二次会模型会被放大,所以被放大的那一部分会被绘制
    glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
    

模板测试Demo

4. 参考

  • https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/02%20Stencil%20testing/

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

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

相关文章

Web Spider Babel安装 Ast抽象语法 - 基本使用

文章目录一、资源地址二、遍历2.1 树结构遍历模式2.2 案例三、下载安装四、案例操作总结提示:以下是本篇文章正文内容,下面案例可供参考 一、资源地址 Ast反混淆语法在线网址:https://astexplorer.net Babel官方文档:https://ww…

玩转Linux内核进程调度,这一篇就够(所有的知识点)

一,进程的分类 在 CPU 的角度看进程行为的话,可以分为两类: CPU 消耗型:此类进程就是一直占用 CPU 计算,CPU 利用率很高IO 消耗型:此类进程会涉及到 IO,需要和用户交互,比如键盘输…

性能测试流程

性能测试实战一.资源指标分析1.判断CPU是否瓶颈的方法2.判断内存是否瓶颈的方法3.判断磁盘I/O是否瓶颈的方法4.判断网络带宽是否是瓶颈的方法二.系统指标分析三.性能调优四.性能测试案例1.项目背景2.实施规划(1)需求分析(2)测试方…

Faster-Rcnn修改转数据集文件

目录 学习python的一些基础知识 argparser assert关键字 让你秒懂Python 类特殊方法__getitem__ lxml.etree.fromstring的使用 统计一下json文件内的种类 正脸红外光 正脸-混合红外光 正脸-交叉偏振光 正脸-平行偏振光 正脸-紫外光 正脸-棕色光 调用mydataset可视化…

我的 System Verilog 学习记录(5)

、 引言 本文简单介绍 System Verilog 语言的 控制流。 前文链接: 我的 System Verilog 学习记录(1) 我的 System Verilog 学习记录(2) 我的 System Verilog 学习记录(3) 我的 System Ver…

算法课堂-分治算法

分治算法 把一任务分成几部分(通常是两部分)来完成(或只完成一部分),从而实现整个任务的完成 或者你可以把递归理解为分治算法的一部分 因为递归就是把问题分解来解决问题 例子 称假币 最笨的方法:两两称…

(三十六)大白话数据库幻读,本质到底是个什么问题?

上一讲我们给大家讲解了不可重复读这个问题,这个问题简单来说,就是一个事务多次查询一条数据,结果每次读到的值都不一样,这个过程中可能别的事务会修改这条数据的值,而且修改值之后事务都提交了,结果导致人…

多变量线性回归模型

多变量线性回归模型 模型参数为n1维向量,此时模型公式为 hθ(x)θ0x0θ1x1θ2x2...θnxnh_{\theta}(x)\theta_{0}x_{0}\theta_{1}x_{1}\theta_{2}x_{2}...\theta_{n}x_{n} hθ​(x)θ0​x0​θ1​x1​θ2​x2​...θn​xn​ 可以简化为 hθ(x)θTXh_{\theta}(x)\th…

Gradle7.4安装与基本使用

文章目录一.前言二.下载Gradle三.Gradle镜像源-全局级配置四.配置Gradle wrapper-项目级配置五.Gradle对测试的支持五.生命周期5.1 settings文件六.Gradle任务入门6.1 任务行为6.2 任务依赖方式七. Dependencies依赖引入7.1 依赖冲突及解决方案八.Gradle整合多模块SpringBoot九…

NLP复习大纲

第一章:概述 1. 什么是自然语言处理? 计算机具备人类的听、说、读、写、译、问、答、搜索、摘要、对话和聊天等能力 知识和常识进行推理和决策 支持客服、诊断、法律、教学等场景 2. 自然语言处理的主要任务有哪些? 分析、理解、转换、…

要理解网络,其实不就是理解这三张表吗

我们如果要理解数据是如果在网络世界中穿梭的,那其实只要了解其中的三张表就可以了。这三张表分别为路由表、转发表、ARP 表。 假设我们用聊天工具聊天的时候,我在北京,你在广东,当我给你发送一条消息的时候。搭载这这条消息的数据…

带你沉浸式体验删库跑路

前言:学习的过程比较枯燥,后面会记录一些比较有意思的东西,比如程序员之间流传的删库跑路的梗,当然本次测试是在虚拟机上进行的并进行了快照保护,所以其实没太大问题。首先得要有一个虚拟机要有一个linux iso文件装在虚拟机上以上两点不是本文重点,如果有需要可以私…

CLIP论文阅读

Learning Transferable Visual Models From Natural Language Supervision 利用自然语言的监督信号学习可迁移的视觉模型 概述 迁移学习方式就是先在一个较大规模的数据集如ImageNet上预训练,然后在具体的下游任务上再进行微调。这里的预训练是基于有监督训练的&am…

排序基础之插入排序

目录 前言 一、什么是插入排序 二、实现插入排序 三、插入排序优化 四、插入排序的特性 前言 上一篇中我们说到了《排序基础之选择排序》,这一篇我们来学习一下排序算法中的另一种基础排序算法——插入排序。 一、什么是插入排序 简单来说就是:每…

break与continue关键字

1.概述 不知道大家有没有这样一种感受哈,有的时候容易混淆break语句和continue语句的用法,总是模棱两可,不敢确定自己是否使用正确了。正好,我们本篇的重点就是break和continue关键字的用法。 2.使用场景 Java中为啥会诞生break…

js——原型和原型链

最近看了很多面试题,看到这个js原型是常考点,于是,我总结了一些该方面的知识点分享给大家,其实原型就是那么一回事,搞明白了就没啥了。结果如下图所示:原型原型又可分为显式原型和隐式原型1.1显式原型显式原…

Linux C代码获取线程ID

Linux C代码获取线程ID gettid可以获取线程id,但是通过man gettid可以看到下面这两句 也就是说glibc没有为这个gettid封装系统调用&#xff0c;需要使用syscall。 #define _GNU_SOURCE#include <unistd.h>#include <sys/syscall.h>#include <sys/types.h>ti…

自动化测试 selenium常用操作

最简单的代码实例import org.openqa.selenium.By; import org.openqa.selenium.chrome.ChromeDriver;public class AutoTestDemo1 {//浏览器自动搜索,暂停是为了能看到&#xff0c;要不访问太快public void testKunKun() throws InterruptedException {//打开浏览器ChromeDrive…

【软件工程】课程作业(三道题目:需求分析、概要设计、详细设计、软件测试)

文章目录&#xff1a;故事的开头总是极尽温柔&#xff0c;故事会一直温柔……&#x1f49c;一、你怎么理解需求分析&#xff1f;1、需求分析的定义&#xff1a;2、需求分析的重要性&#xff1a;3、需求分析的内容&#xff1a;4、基于系统分析的方法分类&#xff1a;5、需求分析…

Java static关键字(重新认识main方法)

static关键字一、static修饰成员的特点二、static什么时候使用三、static注意事项四、重新认识main方法static 是静态的意思&#xff0c;可以修饰成员变量&#xff0c;也可以修饰成员方法 一、static修饰成员的特点 被其修饰的成员, 被该类的所有对象所共享多了一种调用方式, 可…