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);
时间: 2025-01-01 08:12:59

OpenGL ES 中的模板测试的相关文章

Mali GPU OpenGL ES 应用性能优化--测试+定位+优化流程

1. 使用DS-5 Streamline定位瓶颈 DS-5 Streamline要求GPU驱动启用性能测试,在Mali GPU驱动中激活性能测试对性能影响微不足道. 1.1 DS-5 Streamline简介 可使用DS-5 Streamline从CPU和Mali GPU中实时收集性能计数器,然后以图形方式显示这些计数器,其主要功能如下:     ? 收集计数器--从CPU和Mali GPU中     ? 保存收集到的计数器数据以供回放     ? 查看显示GPU活动.GPU活动和Framebu

OpenGL ES总结(六)OpenGL ES中EGL

Agenda: EGL是什么? EGL数据类型 EGL在Android中应用 EGL的工作流程 GLSurfaceView与EGL区别 简单Demo EGL是什么? EGL? is an interface between Khronos rendering APIs such as OpenGL ES or OpenVG and the underlying native platform window system. It handles graphics context managemen

OpenGL ES 2.0 剪裁测试

剪裁测试:可以在渲染时用来限制绘制区域,通过此技术可以在屏幕(帧缓冲)上指定一个矩形区域. //启用剪裁测试 GLES20.glEnable(GL10.GL_SCISSOR_TEST); //设置区域 GLES20.glScissor(0,480,230,200); //禁用剪裁测试 GLES20.glDisable(GL10.GL_SCISSOR_TEST); Alpha测试:当绘制一个片元时,首先检测其Alpha值,若Alpha值满足要求,则通过测试,绘制此片元,负责丢弃此片元,不进行绘制.

opengl ES中的正交投影

由于设备使用的归一化坐标系与像素无关,范围在三个方向上都是-1~1,所以直接硬编码绘制图元的时候可能会因为设备像素问题产生横向或是竖向被压缩(扭曲). 书中的解决方法是将操作放在一个虚拟坐标空间中,就是我们设计顶点数值的时候假象自己就是在虚拟坐标空间中进行的,至于如何映射到设备上,可以不必考虑. 正交投影是一种将一个空间区域投影到一个二维平面上的方法(投影就是把高维降到地位的过程),这里所说的这个空间区域是一个无论多远去看物体的大小都不会变得一个三维空间中的区域,超过这个区域的部分不能被看到.

opengl ES中的透视

由于正交投影的局限性,他只能保证适应屏幕宽高比,但是无法在一定范围内创建出将三维效果转换为二维效果,因此我们使用在绘画艺术中使用的一种技巧: (关于透视方法下面有个网站介绍的不错,配图也很容易懂:http://www.artyfactory.com/index.html ) 因为我们去掉了正交投影,准备使用透视投影,因此有必须要说明透视投影的一些特征. 透视投影有一个名为视锥体的特殊名词,这个的简介有一位博主的介绍相当不错: http://www.cnblogs.com/graphics/arc

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

片断测试其实就是测试每一个像素,只有通过测试的像素才会被绘制,没有通过测试的像素则不进行绘制.OpenGL提供了多种测试操作,利用这些操作可以实现一些特殊的效果.我们在前面的课程中,曾经提到了“深度测试”的概念,它在绘制三维场景的时候特别有用.在不使用深度测试的时候,如果我们先绘制一个距离较近的物体,再绘制距离较远的物体,则距离远的物体因为后绘制,会把距离近的物体覆盖掉,这样的效果并不是我们所希望的.如果使用了深度测试,则情况就会有所不同:每当一个像素被绘制,OpenGL就记录这个像素的“深度”

[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之一:OBJ格式分析

[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之一:OBJ文件格式分析作者:yuezang - iTyran 在iOS的3D开发中常常需要导入通过3DS MAX之类的3D设计软件生成的模型.因为OpenGL ES是不能直接读取这些文件的,所以常常需要开发人员增加接口来导入.通常的做法是在建模软件中建立3D模型之后在OpenGL ES中导入并进行控制.    3DS MAX通常的保存格式有*.max(现在生成的版本的格式),*.3ds(低版本的3ds Max生成的格式)

Chapter 1 : OpenGLES 3.0 简介 (2)—— OpenGL ES 3.0

管道 如前所属,本书讲解的API版本是OpenGL ES 3.0.本书的目标是,深入讲解OpenGL ES 3.0的技术细节,给出具体的例子来说明如何使用某个特性,并且讨论了各种性能优化技术.当您读完这本书,您应该可以对OpenGL ES 3.0API有一个很好的把握.您将可以轻松的写出让人新服的OpenGL ES 3.0的应用程序,并且您不必通过阅读多种OpenGL ES的规范来搞懂某个特性是如何工作的. OpenGL ES 3.0实现了可编程着色图形管道.OpenGL ES 3.0规范包含两

Android OpenGL ES零基础系列(三):OpenGL ES的渲染管道及VertexShader与FragmentShader

前言 在前2篇文章中,我们都说到着色器,且在第二篇中正式说到,这着色器只能用在OpenGL ES2.x等可编程管道里面,而在OpenGL ES1.x是不能用的.但我们一直没有说这是为什么,两者有什么区别.那这篇我们就一起来学习下OpenGL ES中的渲染管道. 正文 管道,英文名叫Pipeline,相信用过FaceBook图片加载库的同学对这个管道并不陌生,因为SimpleImageDrawee里面也是用的管道来对图片进行的一个处理.由于其底层也是C,因此我可以大胆的猜想,FaceBook图片加