OpenGL ES 中的模板测试

模板测试的主要功能是丢弃一部分片元,相对于深度检测来说,模板测试提出的片元数量相对较少。模板测试发生在剪裁测试之后,深度测试之前。

使用模板测试时很重要的代码提示:

1 1.glClear( GL_STENCIL_BUFFER_BIT);
2 //启用模板测试
3 2.glEnable(GL_STENCIL_TEST);

大多数情况你的模板遮罩(stencil mask)写为0x00或0xFF就行。

1 // 0xFF == 0b11111111,此时,模板值与它进行按位与运算结果是模板值,模板缓冲可写
2 glStencilMask(0xFF);
3
4 // 0x00 == 0b00000000 == 0,此时,模板值与它进行按位与运算结果是0,模板缓冲不可写
5 glStencilMask(0x00);

glStencilMask允许我们给模板值设置一个位遮罩(Bitmask),它与模板值进行按位与(AND)运算决定缓冲是否可写。默认设置的位遮罩都是1,这样就不会影响输出,但是如果我们设置为0x00,所有写入深度缓冲最后都是0。

另外,可以通过glStencilFunc和glStencilOp决定模板测试通过或失败以及怎样影响模板缓冲。

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

  • func:设置模板测试操作。这个测试操作应用到已经储存的模板值和glStencilFunc的ref值上,可用的选项是:

GL_NEVER、GL_LEQUAL、GL_GREATER、GL_GEQUAL、GL_EQUAL、GL_NOTEQUAL、GL_ALWAYS。它们的语义和深度缓冲的相似。

  • ref:指定模板测试的引用值。模板缓冲的内容会与这个值对比。
  • mask:指定一个遮罩,在模板测试对比引用值和储存的模板值前,对它们进行按位与(and)操作,初始设置为1。

代码片段如下:

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

glStencilFunc只描述了OpenGL对模板缓冲做什么,而不是描述我们如何更新缓冲。这就需要glStencilOp方法了。

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

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

glStencilOp函数默认设置为 (GL_KEEP, GL_KEEP, GL_KEEP) ,所以任何测试的任何结果,模板缓冲都会保留它的值。
默认行为不会更新模板缓冲,所以如果你想写入模板缓冲的话,你必须像任意选项指定至少一个不同的动作。

注意:三维遮罩

1     glDepthMask(GL_TRUE);//启用写入深度值
2     glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
3     glStencilFunc(GL_ALWAYS, 1, 0xFF);
4     glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP);
5     glStencilMask(0xFF);

posted on 2016-12-26 16:00 bky2016 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/calence/p/6222650.html

OpenGL ES 中的模板测试相关推荐

  1. Unity中使用模板测试模拟Mask组件效果

    本文分享Unity中使用模板测试模拟Mask组件效果 在上一篇文章中, 我们分享了模板测试的基础知识, 在今天的分享中, 我们会尝试使用模板测试来模拟遮罩效果. Unity中使用模板测试模拟Mask组 ...

  2. OpenGL基础30:模板测试

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

  3. (01)OpenGL es中只在指定区域渲染view

    效果 图1 右侧显示view的内容 主要代码 (1)main_activity.java的内容 import androidx.appcompat.app.AppCompatActivity; imp ...

  4. 关于OpenGL ES中的纹理压缩

    基于OpenGL ES的压缩纹理有常见的如下几种实现: 1. ETC1(Ericcson texture compression) 2. PVRTC(PowerVR texture compressi ...

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

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

  6. OpenGL ES学习(8)——剪裁测试认识

    本文介绍常见测试和任意剪裁平面:剪裁测试.Alpha测试.模板测试和任意剪裁平面. 1.1 剪裁测试 剪裁测试,用来在渲染场景时限制绘制区域,实现同时在屏幕上绘制主视角与次视角场景. 1.1.1 剪裁 ...

  7. 关于openGL, openGL ES, openVG及android中2D调用关系的报告

    关于openGL, openGL ES, openVG及android中2D调用关系的报告 http://blog.chinaunix.net/u3/99423/showart_2203591.htm ...

  8. OpenGL ES 如何能看到一个物体内部和象3dmax中能只显示网格线

    上一篇 OpenGL ES 正反面设置指令 中分析了正反面的判区方法,那么正反面有什么用呢?接下来我们就要引入一个叫做背面消除的概念.在3dmax中有个选项,当你用挤压修改器挤出一个中空的长方体时,在 ...

  9. Unity管线渲染中的三大测试之模板测试

    我感觉将近一个月没有写技术文档了,最近了可能能在研究一些比较抽象计算机图形学,知识点太多,也过于零碎.我个人认为管线渲染流程当中三大测试是控制效果的一个关卡.这篇文章今天本来写了个开头,回到家看了题目 ...

  10. 在 iOS 中使用 OpenGL ES 实现绘画板

    作者:lyman 来源: http://www.lymanli.com/2020/01/04/ios-opengles-paint/ 今天我们使用 OpenGL ES 来实现一个绘画板,主要介绍在 O ...

最新文章

  1. hadoop8088端口查看历史打不开,但是在虚拟机上可以打开的解决办法
  2. xamarin ios html5 video.js 无法播放
  3. java最好的开发工具_IntelliJ IDEA Ultimate Edition 2018 最好的 Java 开发工具
  4. jupyter-使用及设置密码
  5. C和指针之动态内存分配之(编写calloc函数,函数内部使用malloc函数来获取内存)
  6. 三菱fx5u编程手册_FX5U系列PLC控制伺服3种方式
  7. 使用mprotect系统调用来调试内存问题:memalign,aligned_alloc
  8. SAP License:CO第一夜-成本要素会计
  9. C++与tolua++的完整调用流程,超级详解解决交互疑难
  10. 在 ML2 中配置 VXLAN - 每天5分钟玩转 OpenStack(110)
  11. Python实现双色球随机选号
  12. 教你快速设计正交试验及试验数据分析
  13. html手机端最小字体,手机端h5页面字体大小适配
  14. iOS开发值苹果手机各种尺寸详细表以及iPhoneX、iPhoneXS、iPhoneXR、iPhoneXSMax屏幕适配
  15. asp站点服务器,ASP网站搭建 ASP服务器搭建 教程
  16. 私有CA搭建并将HTTPS应用于Tomcat、Springboot
  17. 团队协作效率低?多半是这5大障碍搞的鬼
  18. PR 多轨道字幕设置
  19. UR机器人使用教程-总结
  20. SMS-EMOA:基于超体积支配的多目标选择

热门文章

  1. 5.性能测试工具比较:Jmeter和LR
  2. python基础--集合
  3. jqGrid复制表格数据到另外一张表中
  4. Subsequence Count (线段树)
  5. 利用H5开发微信公众号
  6. redis客户端使用密码
  7. 20145202马超 《Java程序设计》 实验一 实验报告
  8. HashMap的工作原理深入再深入
  9. libpcap 中的 struct block
  10. 有趣的视频 国外计算机课程