opengl 模板测试 glStencilOp glStencilFunc
下面来设置蒙板缓存和蒙板测试。
首先我们启用蒙板测试,这样就可以修改蒙板缓存中的值。
下面我们来解释蒙板测试函数的含义:
当你使用glEnable(GL_STENCIL_TEST)启用蒙板测试之后,蒙板函数用于确定一个颜色片段是应该丢弃还是保留(被绘制)。蒙板缓存区 中的值与参考值ref进行比较,比较标准是func所指定的比较函数。参考值和蒙板缓存区的值都可以与掩码进行为AND操作。蒙板测试的结果还导致蒙板缓 存区根据glStencilOp函数所指定的行为进行修改。
func的参数值如下:
常量 | 含义 |
GL_NEVER | 从不通过蒙板测试 |
GL_ALWAYS | 总是通过蒙板测试 |
GL_LESS | 只有参考值<(蒙板缓存区的值&mask)时才通过 |
GL_LEQUAL | 只有参考值<=(蒙板缓存区的值&mask)时才通过 |
GL_EQUAL | 只有参考值=(蒙板缓存区的值&mask)时才通过 |
GL_GEQUAL | 只有参考值>=(蒙板缓存区的值&mask)时才通过 |
GL_GREATER | 只有参考值>(蒙板缓存区的值&mask)时才通过 |
GL_NOTEQUAL | 只有参考值!=(蒙板缓存区的值&mask)时才通过 |
接下来我们解释glStencilOp函数,它用来根据比较结果修改蒙板缓存区中的值,它的函数原形为:
void glStencilOp(GLenum sfail, GLenum zfail, GLenum zpass),各个参数的含义如下:
sfail
当蒙板测试失败时所执行的操作
zfail
当蒙板测试通过,深度测试失败时所执行的操作
zpass
当蒙板测试通过,深度测试通过时所执行的操作
具体的操作包括以下几种
常量 | 描述 |
GL_KEEP | 保持当前的蒙板缓存区值 |
GL_ZERO | 把当前的蒙板缓存区值设为0 |
GL_REPLACE | 用glStencilFunc函数所指定的参考值替换蒙板参数值 |
GL_INCR | 增加当前的蒙板缓存区值,但限制在允许的范围内 |
GL_DECR | 减少当前的蒙板缓存区值,但限制在允许的范围内 |
GL_INVERT | 将当前的蒙板缓存区值进行逐位的翻转 |
当完成了以上操作后我们绘制一个地面,当然现在你什么也看不到,它只是把覆盖地面的蒙板缓存区中的相应位置设为1。
glEnable(GL_STENCIL_TEST); // 启用蒙板缓存glStencilFunc(GL_ALWAYS, 1, 1); // 设置蒙板测试总是通过,参考值设为1,掩码值也设为1glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); // 设置当深度测试不通过时,保留蒙板中的值不变。如果通过则使用参考值替换蒙板值glDisable(GL_DEPTH_TEST); // 禁用深度测试DrawFloor(); // 绘制地面
opengl 模板测试 glStencilOp glStencilFunc相关推荐
- opengl模板测试实例
在opengl中, 可以开启模板测试功能,来限定某一部分是可画的,某一部分是不可画的.这可通过设置模板模式来控制哪部分是可画的, 有点类似在墙上喷字. 虽说剪刀测试也可以限定蓝屏的某一部分可画,但不适 ...
- OpenGL模板测试通俗理解
看书籍或资料往往还是云里雾里的,这里写一下自己的理解.希望对需要的人有帮助. 简而言之: 模板缓冲区和帧缓冲区一样大 模板缓冲区初始状态是什么? 在glClearBuffer的时候清空,所以初始状态是 ...
- LearnOpenGL学习笔记——模板测试
模板测试 当片段着色器处理完一个片段之后,模板测试(Stencil Buffer)会开始执行,和深度测试一样,它也可能会丢弃片段.接下来,被保留的片段会进入深度测试,它可能会丢弃更多的片段.模板测试是 ...
- (zt)OpenGL中的Alpha测试,深度测试,模板测试,裁减测试
转自http://www.cppblog.com/flashboy/archive/2009/09/01/94974.html 大家好.现在因为参加工作的关系,又是长时间没有更新.趁着国庆的空闲,总算 ...
- OpenGL基础30:模板测试
前置:OpenGL基础29:深度测试 一.模板测试 前面一章提到过:深度缓冲测试在片段着色器运行.以及模板测试(Stencil Testing)之后,那么这下知道模板测试是在什么时候了吧,模板测试和深 ...
- OpenGL学习笔记(七)-深度测试-模板测试-混合
参考网址:LearnOpenGL 中文版 第四章 高级OpenGL 4.1 深度测试 4.1.1 深度缓冲 1.深度缓冲用来防止被阻挡的面渲染到其它面的前面,由窗口系统自动创建,在每个片段中储存了它的 ...
- OpenGL学习二十九:模板缓冲区与模板测试
帧缓冲区有许多缓冲区构成,这些缓冲区大致分为: 颜色缓冲区:用于绘图的缓冲区,它包含了颜色索引或者RGBA颜色数据. 深度缓冲区:存储每个像素的深度值,当启动深度测试时,片段像素深度值和深度缓冲区深度 ...
- OpenGL stencil test模板测试的实例
OpenGL stencil test模板测试 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <glad/glad.h> #incl ...
- Opengl-深度测试模板测试
###深度测试 深度缓冲:用来存储深度信息的,可以这么理解,在你屏幕上最后留下的裁剪区域你看到的东西其实是有深度的,就像现实世界里一样,有远近这样.然后这个远近的程度信息就存储在了深度缓冲里 深度测试 ...
最新文章
- R语言——双样本独立检验的快速分析立检验的快速分析
- 数据仓库的 RDBMS 性能优化指南
- 为什么不应该使用(长期存在的)功能分支
- 前端学习(2684):重读vue电商网站5之登录页面总结如何进行表单验证
- 驱动思想之机制和策略
- 在生成.net core 3.0程序时不包含nuget库
- 支持的vCenter Server High Availability选项(2096800)
- CENTOS6.5 TFS部署
- 谐波合成法matlab,基于Kaimal谱采用谐波合成法生成脉动风场
- 函数的参数,参数为数组
- 计算机组成原理 最新教材,《计算机组成原理》东南大学教材.pdf
- java学习网站大全
- linux系统装psp,如何在Linux中玩PSP游戏
- 子列和列_最大子列和
- wmp流代理服务器设置为空,03服务器安装wmp10的方法
- 数据库入口和密码:维普、万方和cnki(转)
- windows powershell激活anaconda虚拟环境
- 小迪渗透Waf绕过(陆)
- 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
- Android 蓝牙 -- 还原网络设置 删除蓝牙所有存储配对信息流程分析---全网唯一