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);
转载于:https://www.cnblogs.com/calence/p/6222650.html
OpenGL ES 中的模板测试相关推荐
- Unity中使用模板测试模拟Mask组件效果
本文分享Unity中使用模板测试模拟Mask组件效果 在上一篇文章中, 我们分享了模板测试的基础知识, 在今天的分享中, 我们会尝试使用模板测试来模拟遮罩效果. Unity中使用模板测试模拟Mask组 ...
- OpenGL基础30:模板测试
前置:OpenGL基础29:深度测试 一.模板测试 前面一章提到过:深度缓冲测试在片段着色器运行.以及模板测试(Stencil Testing)之后,那么这下知道模板测试是在什么时候了吧,模板测试和深 ...
- (01)OpenGL es中只在指定区域渲染view
效果 图1 右侧显示view的内容 主要代码 (1)main_activity.java的内容 import androidx.appcompat.app.AppCompatActivity; imp ...
- 关于OpenGL ES中的纹理压缩
基于OpenGL ES的压缩纹理有常见的如下几种实现: 1. ETC1(Ericcson texture compression) 2. PVRTC(PowerVR texture compressi ...
- (zt)OpenGL中的Alpha测试,深度测试,模板测试,裁减测试
转自http://www.cppblog.com/flashboy/archive/2009/09/01/94974.html 大家好.现在因为参加工作的关系,又是长时间没有更新.趁着国庆的空闲,总算 ...
- OpenGL ES学习(8)——剪裁测试认识
本文介绍常见测试和任意剪裁平面:剪裁测试.Alpha测试.模板测试和任意剪裁平面. 1.1 剪裁测试 剪裁测试,用来在渲染场景时限制绘制区域,实现同时在屏幕上绘制主视角与次视角场景. 1.1.1 剪裁 ...
- 关于openGL, openGL ES, openVG及android中2D调用关系的报告
关于openGL, openGL ES, openVG及android中2D调用关系的报告 http://blog.chinaunix.net/u3/99423/showart_2203591.htm ...
- OpenGL ES 如何能看到一个物体内部和象3dmax中能只显示网格线
上一篇 OpenGL ES 正反面设置指令 中分析了正反面的判区方法,那么正反面有什么用呢?接下来我们就要引入一个叫做背面消除的概念.在3dmax中有个选项,当你用挤压修改器挤出一个中空的长方体时,在 ...
- Unity管线渲染中的三大测试之模板测试
我感觉将近一个月没有写技术文档了,最近了可能能在研究一些比较抽象计算机图形学,知识点太多,也过于零碎.我个人认为管线渲染流程当中三大测试是控制效果的一个关卡.这篇文章今天本来写了个开头,回到家看了题目 ...
- 在 iOS 中使用 OpenGL ES 实现绘画板
作者:lyman 来源: http://www.lymanli.com/2020/01/04/ios-opengles-paint/ 今天我们使用 OpenGL ES 来实现一个绘画板,主要介绍在 O ...
最新文章
- hadoop8088端口查看历史打不开,但是在虚拟机上可以打开的解决办法
- xamarin ios html5 video.js 无法播放
- java最好的开发工具_IntelliJ IDEA Ultimate Edition 2018 最好的 Java 开发工具
- jupyter-使用及设置密码
- C和指针之动态内存分配之(编写calloc函数,函数内部使用malloc函数来获取内存)
- 三菱fx5u编程手册_FX5U系列PLC控制伺服3种方式
- 使用mprotect系统调用来调试内存问题:memalign,aligned_alloc
- SAP License:CO第一夜-成本要素会计
- C++与tolua++的完整调用流程,超级详解解决交互疑难
- 在 ML2 中配置 VXLAN - 每天5分钟玩转 OpenStack(110)
- Python实现双色球随机选号
- 教你快速设计正交试验及试验数据分析
- html手机端最小字体,手机端h5页面字体大小适配
- iOS开发值苹果手机各种尺寸详细表以及iPhoneX、iPhoneXS、iPhoneXR、iPhoneXSMax屏幕适配
- asp站点服务器,ASP网站搭建 ASP服务器搭建 教程
- 私有CA搭建并将HTTPS应用于Tomcat、Springboot
- 团队协作效率低?多半是这5大障碍搞的鬼
- PR 多轨道字幕设置
- UR机器人使用教程-总结
- SMS-EMOA:基于超体积支配的多目标选择