下面来设置蒙板缓存和蒙板测试。

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

下面我们来解释蒙板测试函数的含义:

当你使用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,掩码值也设为1

	glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);		// 设置当深度测试不通过时,保留蒙板中的值不变。如果通过则使用参考值替换蒙板值

	glDisable(GL_DEPTH_TEST);				// 禁用深度测试

	DrawFloor();					// 绘制地面

opengl 模板测试 glStencilOp glStencilFunc的更多相关文章

  1. OpenGL(十四) 模板测试

    启用模板测试时,OpenGL会在内存中开辟一块空间作为模板缓冲区,里边保存了每个像素的"模板值",模板测试的过程就是把每一个像素的模板值与一个设定的模板参考值进行比较,符合设定条件 ...

  2. opengl学习-利用模板测试勾画物体轮廓中出现的一个问题

    我在学习OpenGL模板测试勾画物体轮廓的时候,出现了这个问题: 这个出现的原因就是,改变摄像机的时候,每次绘制,上次绘制中模板缓冲区的数据没有清除的原因.也就是在while循环开始的时候,glCle ...

  3. OpenGL ES 中的模板测试

    模板测试的主要功能是丢弃一部分片元,相对于深度检测来说,模板测试提出的片元数量相对较少.模板测试发生在剪裁测试之后,深度测试之前. 使用模板测试时很重要的代码提示: 1.glClear( GL_STE ...

  4. OpenGL利用模板测试实现不规则裁剪

    本文是原创文章,如需转载,请注明文章出处 在游戏开发中,经常会有这样的需求:给定一张64x64的卡牌素材,要求只显示以图片中心为圆点.直径为64的圆形区域,这就要用到模板测试来进行不规则裁剪. 实现不 ...

  5. OpenGL模板缓冲区与模板测试

    原文地址:http://www.blogjava.net/qileilove/archive/2014/01/23/409269.html 帧缓冲区有许多缓冲区构成,这些缓冲区大致分为: 颜色缓冲区: ...

  6. OpenGL-----深度测试,剪裁测试、Alpha测试和模板测试

    片断测试其实就是测试每一个像素,只有通过测试的像素才会被绘制,没有通过测试的像素则不进行绘制.OpenGL提供了多种测试操作,利用这些操作可以实现一些特殊的效果.我们在前面的课程中,曾经提到了“深度测 ...

  7. OpenGL光照测试

    OpenGL光照测试 花了大概半个月,研究了OpenGL的光照.请注意是固定管线渲染的光照,如果使用着色器的高手们请飘过.这个程序是通过光照对模型的照射,来研究OpenGL光照的性质.以后可以通过这个 ...

  8. windows屏幕保护程序opengl模板

    Visual Studio 2013 屏幕保护程序opengl模板 ScreenSaver.cpp #define VC_EXTRALEAN #include <windows.h> #i ...

  9. [UnityShader基础]05.模板测试

    参考链接: https://blog.csdn.net/u011047171/article/details/46928463 https://blog.csdn.net/JohnBlu/articl ...

随机推荐

  1. ev3dev :利用ssh登录系统

    ev3dev是在debian 8 的基础上修改的,主页上只介绍了利用usb连接系统后,ssh登录的方法. 可是我想用wifi连接到网络后,用ssh登录,非usb线连接. ev3dev的默认用户名为:r ...

  2. NEXYS 3开发板练手--USB UART(三)

    接着上一篇,今天我们来建立一个能用于实际工程中的DEMO. 首先,为了使我们的发送机不像上一个DEMO一样无节制的循环发送,我们需要修改代码,增加使发送机停止发送的控制部分,修改后的代码如下: `ti ...

  3. 【Android】11.0 第11章 活动和片段--本章示例主界面

    分类:C#.Android.VS2015: 创建日期:2016-02-21 一.简介 这一章我们学习activity和fragment,深入理解activity和fragment的生命周期是如何工作的 ...

  4. AFNetworking、ASIHTTPRequest中SSL的使用

    首先介绍下AFNetworking中的使用: 2.0要注意个地方:IOS7及其以后,採用AFHTTPSessionManager,IOS7之前採用AFHTTPRequestOperationManag ...

  5. C# 获取指定目录下所有文件信息

    /// <summary> /// 返回指定目录下所有文件信息 /// </summary> /// <param name="strDirectory&quo ...

  6. 解决MAC下xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools)的问题

    将系统升级到了最新10.13.3 macOS High Sierra后,在使用ctags命令时会出现如下问题: xcrun: error: invalid active developer path ...

  7. 刷新页面要通过F5

    而不是选中地址栏再按enter键,这样可能产生两种问题: 1.地址栏中的URL可能包括你上次提交的参数,你按了enter之后可能导致上次提交的参数重复提交 2.可能导致根本就没有刷新页面,刚才我修改了 ...

  8. Python实现二叉树及其4种遍历

    Python & BinaryTree 1. BinaryTree (二叉树) 二叉树是有限个元素的集合,该集合或者为空.或者有一个称为根节点(root)的元素及两个互不相交的.分别被称为左子 ...

  9. freemarker插值

    http://blog.csdn.net/chang_li/article/details/51913105 在复杂页面上(包含大量判断.日期金额格式化)的页面上,freemarker的性能比使用ta ...

  10. position定位属性

    值 描述 absolute 生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位. 元素的位置通过 "left", "top", " ...