转载  http://www.cnblogs.com/aokman/archive/2010/12/13/1904723.html

作者:Nin+.Lee

邮箱:lilei9110@gmail.com

* 本文属原创,转载请注明出处。

与颜色缓冲区和深度缓冲区类似,模板缓冲区可以为屏幕上的每个像素点保存一个无符号整数值。这个值的具体意义视程序的具体应用而定。在渲染的过程中,可以用这个值与一个预先设定的参考值相比较,根据比较的结果来决定是否更新相应的像素点的颜色值。这个比较的过程被称为模板测试。模板测试发生在透明度测试(alpha test)之后,深度测试(depth test)之前。如果模板测试通过,则相应的像素点更新,否则不更新。图形渲染管线中,基于单个像素的测试操作的顺序如下图。

在模板测试的过程中,可以先使用一个比较用掩码(comparison mask)与模板缓冲区中的值进行位与运算,再与参考值进行比较,从而实现对模板缓冲区中的值的某一位上的置位状态的判断。这样,模板缓冲区中的值不仅可以作为一个独立的整体使用,还可以作为一个比特集合使用。

在OpenGL中,可以通过调用glStencilFunc()函数来设定,比较条件(comparison function)、参考值(reference value)以及比较用掩码(comparison mask)。例如,

glStencilFunc(GL_EQUAL, // 比较条件

0x1, // 参考值

0xff); // 比较用掩码

比较条件的种类如下:

方法

参考值与模板值之间的比较结果

GL_NEVER

总是失败

GL_ALWAYS

总是通过测试

GL_LESS

当参考值小于模板值时,通过测试

GL_LEQUAL

当参考值小于等于模板值时,通过测试

GL_EQUAL

当参考值等于模板值时,通过测试

GL_GEQUAL

当参考值大于等于模板值时,通过测试

GL_GREATER

当参考值大于模板值时,通过测试

GL_NOTEQUAL

当参考值不等于模板值时,通过测试

除了比较参考值与模板值之外,我们还需要使用一些操作来更新模板缓冲区中的值,这些操作被称为模板操作(stencil operation)。模板缓冲区的更新与模板测试的结果以及深度测试的结果有着密切的联系。模板操作可以为下述三种情况,分别指定相应的更新方法。

1. 模板测试失败。

2. 模板测试通过,但深度测试失败。

3. 模板测试通过,且深度测试通过。

当上述情况中的一个发生时,就会执行预先设定的更新操作。在OpenGL中,可以使用glStencilOp()函数来为上述三种情况分别设置更新方法。例如,

glStencilOp(GL_KEEP, // 第一种情况更新方法

GL_DECR, // 第二种情况的更新方法

GL_INCR); // 第三种情况的更新方法

可是设置的更新方法如下:

更新方法

描述

GL_KEEP

保持当前的模板值不变

GL_ZERO

将当前的模板值设为0

GL_REPLAC

将当前的模板值设置为参考值

GL_INCR

在当前的模板值上加1

GL_DECR

在当前的模板值上减1

GL_INVERT

对当前的模板值进行按位取反操作

我们可以通过写入掩码(write mask)来更新模板值指定比特位上的置位状态。OpenGL中,提供了glStencilMask()函数来设置写入掩码。例如,

glStencilMask(0xff);

默认情况下,模板测试功能是禁用的。在OpenGL中可以通过

glEnable(GL_STENCIL_TEST);

glDisable(GL_STENCIL_TEST);

来启用和禁用模板测试。

通常,在渲染开始之前,需要对模板缓冲区执行清理操作,将模板缓冲区的值初始化为某个指定的值。在OpenGL中,可以通过

glClearStencil()函数来设置这个指定的初始值。例如,

glClearStencil(0); // 初始为0

然后,用

glClear(GL_STENCIL_BUFFER_BIT);

执行实际的清理操作。注意,在使用OpenGL清理模板缓冲区的时候,OpenGL会清理的过程中应用写入掩码。如果你想保留模板值某些位上的置位状态,这个功能显然是非常有用的。但是,如果你希望将所有的模板值都初始化为某个指定的初始值时,这同样也可能会造成一些迷惑。

为了功能的完整性,OpenGL还提供了读写、复制模板值的操作。把glReadPixels()、glDrawPixels()、glCopyPixels()的格式参数设置为GL_STENCIL之后,就可以对模板缓冲区进行读写、复制操作了。

参考文献

1. David Blythe, The Stencil Buffer,

http://www.opengl.org/resources/code/samples/sig99/advanced99/notes/node117.html

2. Mark J. Kilgard, Improving Shadows and Reflections via the Stencil Buffer

Stencil Buffer(模板缓冲区)相关推荐

  1. 什么是模板缓冲(Stencil Buffer)

    什么是模板缓冲(Stencil Buffer) 模板缓冲类似于深度缓冲.事实上,它使用深度缓冲的一部分(因此,深度缓冲常常被称做depth-stencil缓冲).深度缓冲让程序员可以设置一个模板函数测 ...

  2. Unity Shader: 理解Stencil buffer并将它用于一些实战案例(描边,多边形填充,反射区域限定,阴影体shadow volume阴影渲染)

    本文示例项目Github连接:https://github.com/liu-if-else/UnityStencilBufferUses 最近有两次被人问到stencil buffer的用法,回答的含 ...

  3. 【D3D11游戏编程】学习笔记十八:模板缓冲区的使用、镜子的实现

    (注:[D3D11游戏编程]学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 模板缓冲区(Stencil Buffe ...

  4. OPenGL模板缓冲区示例程序

    模板测试是把像素存储在模板缓冲区的值与一个参考值进行比较.根据测试的结果,对模板缓冲区中得这个值进行相应的修改. Note:模板测试只有在存在模板缓冲区的情况下才会执行,如果不存在模板缓冲区,模板测试 ...

  5. 3D角色遮挡住UI的实现,关于Stencil Buffer,描边,以及其他

    3D角色遮挡住UI的实现,关于Stencil Buffer,描边,以及其他 我这么懒的人能会写这篇博客,主因是这个需求对我造成的大量伤害~~~ 起因 最近服务器AI的工作刚刚阶段性完成,马上被策划拉过 ...

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

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

  7. OpenGL使用模板缓冲区和剪切平面

    OpenGL使用模板缓冲区和剪切平面 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <stdio.h> #include " ...

  8. opengl模板缓冲区

    相信大家有些人对opengl的模板缓冲区不是很理解,包括我最开始也是,opengl的模板缓冲区其实就是采用过滤的技术来控制那些颜色可以绘制,那些不能进行绘制.这里的过滤技术也就是我们的一个控制方法,主 ...

  9. buffer java nio_Java NIO深入理解Buffer(缓冲区)

    前言 Github:https://github.com/yihonglei/java-all Project:java-nio 一 Buffer概述 Java NIO中的Buffer用于和NIO通道 ...

  10. Buffer(缓冲区)

    Buffer(缓冲区) Buffer的结构和数组相似,操作的方法和数组类似 数组中不能存储二进制的文件,而Buffer是专门用来存储二进制的数据 buffer不用引入模块,直接使用即可,就是用来保存数 ...

最新文章

  1. linux mysql5.7.11安装_Linux下安装MySQL 5.7.11
  2. SNMP在windows linux router上的配置笔记
  3. php军事网站源码,军事网站的设计与实现(PHP+MYSQL)(含录像)
  4. 命名空间“Microsoft.Office”中不存在类型或命名空间名称“Interop”(是否缺少程序集引用?...
  5. NOIP2011选择客栈[递推]
  6. 《Linux编程》课堂测验 ·002【Shell编程】
  7. 机器学习-决策树(XGBoost、LightGBM)
  8. 如何搭建企业数据平台
  9. 3Dmax读取丢失的贴图的方法
  10. vijos 1066 树状数组
  11. Sigmoid函数求导过程
  12. 数据分析方法论(一)
  13. 腾讯天龙八部手游服务器账号上线,天龙八部手游服务器的注册已达到上限_服务器注册上限怎么解决_玩游戏网...
  14. 新数据时代,浪潮存储如何革故鼎“新”
  15. Apollo 参考线平滑方法Fem Pos Deviation Smoother
  16. TypeError: invalid destination position for blit
  17. 踩坑记---VSCode--It seems that the gevent monkey-patching is being used. Please set an environment ...
  18. SpringBoot中Mybatis-plus的通用接口BaseMapper方法演示(上)
  19. 开发一个从磁力链取得影片截图的命令行工具
  20. charles手机抓包配置

热门文章

  1. (转)Three.JS学习 9:WEBVR 入门demo
  2. 医学统计学基础——第一讲
  3. 毕业照还可以这样玩()
  4. Java中IO流有哪些
  5. Python高性能编程
  6. 凸优化第五章对偶 5.3 几何解释
  7. Linux交换空间(swap space)
  8. stm32的HAL库uart的注意点
  9. 常用的DIV+CSS网站布局的基本框架结构-完整版
  10. velocity--shiro