下面来设置蒙板缓存和蒙板测试。
首先我们启用蒙板测试,这样就可以修改蒙板缓存中的值。

下面我们来解释蒙板测试函数的含义:
当你使用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相关推荐

  1. opengl模板测试实例

    在opengl中, 可以开启模板测试功能,来限定某一部分是可画的,某一部分是不可画的.这可通过设置模板模式来控制哪部分是可画的, 有点类似在墙上喷字. 虽说剪刀测试也可以限定蓝屏的某一部分可画,但不适 ...

  2. OpenGL模板测试通俗理解

    看书籍或资料往往还是云里雾里的,这里写一下自己的理解.希望对需要的人有帮助. 简而言之: 模板缓冲区和帧缓冲区一样大 模板缓冲区初始状态是什么? 在glClearBuffer的时候清空,所以初始状态是 ...

  3. LearnOpenGL学习笔记——模板测试

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

  4. (zt)OpenGL中的Alpha测试,深度测试,模板测试,裁减测试

    转自http://www.cppblog.com/flashboy/archive/2009/09/01/94974.html 大家好.现在因为参加工作的关系,又是长时间没有更新.趁着国庆的空闲,总算 ...

  5. OpenGL基础30:模板测试

    前置:OpenGL基础29:深度测试 一.模板测试 前面一章提到过:深度缓冲测试在片段着色器运行.以及模板测试(Stencil Testing)之后,那么这下知道模板测试是在什么时候了吧,模板测试和深 ...

  6. OpenGL学习笔记(七)-深度测试-模板测试-混合

    参考网址:LearnOpenGL 中文版 第四章 高级OpenGL 4.1 深度测试 4.1.1 深度缓冲 1.深度缓冲用来防止被阻挡的面渲染到其它面的前面,由窗口系统自动创建,在每个片段中储存了它的 ...

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

    帧缓冲区有许多缓冲区构成,这些缓冲区大致分为: 颜色缓冲区:用于绘图的缓冲区,它包含了颜色索引或者RGBA颜色数据. 深度缓冲区:存储每个像素的深度值,当启动深度测试时,片段像素深度值和深度缓冲区深度 ...

  8. OpenGL stencil test模板测试的实例

    OpenGL stencil test模板测试 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <glad/glad.h> #incl ...

  9. Opengl-深度测试模板测试

    ###深度测试 深度缓冲:用来存储深度信息的,可以这么理解,在你屏幕上最后留下的裁剪区域你看到的东西其实是有深度的,就像现实世界里一样,有远近这样.然后这个远近的程度信息就存储在了深度缓冲里 深度测试 ...

最新文章

  1. R语言——双样本独立检验的快速分析立检验的快速分析
  2. 数据仓库的 RDBMS 性能优化指南
  3. 为什么不应该使用(长期存在的)功能分支
  4. 前端学习(2684):重读vue电商网站5之登录页面总结如何进行表单验证
  5. 驱动思想之机制和策略
  6. 在生成.net core 3.0程序时不包含nuget库
  7. 支持的vCenter Server High Availability选项(2096800)
  8. CENTOS6.5 TFS部署
  9. 谐波合成法matlab,基于Kaimal谱采用谐波合成法生成脉动风场
  10. 函数的参数,参数为数组
  11. 计算机组成原理 最新教材,《计算机组成原理》东南大学教材.pdf
  12. java学习网站大全
  13. linux系统装psp,如何在Linux中玩PSP游戏
  14. 子列和列_最大子列和
  15. wmp流代理服务器设置为空,03服务器安装wmp10的方法
  16. 数据库入口和密码:维普、万方和cnki(转)
  17. windows powershell激活anaconda虚拟环境
  18. 小迪渗透Waf绕过(陆)
  19. 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
  20. Android 蓝牙 -- 还原网络设置 删除蓝牙所有存储配对信息流程分析---全网唯一

热门文章

  1. 2008R2Win7管理二十八Mail之基本使用
  2. tornado(七)
  3. java枚举变量反解析用法
  4. 实现多种方式对MYSQL进行备份
  5. 小tips:JS严格模式(use strict)下不能使用arguments.callee的替代方案
  6. 搜索引擎:文本分类——TF/IDF算法
  7. 提高云计算中的软件质量
  8. dede采集 标题不完整
  9. Webservices
  10. IIS5.1/IIS6.0 整合Tomcat6.0.14完全版