模板测试 (2012.10.29)

1.步骤:

首先在创建场景时打开模板缓存。

然后在需要的时候用glEnable允许模板缓存的使用。

在正式使用之前我们需要用模板缓存指定接下来允许进行绘图的地方。因此我们就需要向模板缓存当中写入关于这个区域的数据而写入的过程类似与绘制的过程。在写入这些数据之前为了保证这个写入的过程不会改写深度缓存和颜色缓存,我们必须要用glColorMask指定所有的颜色掩码为GL_FALSE来保证没有任何颜色被写入到颜色缓存,而对于深度缓存的操作则非常的简单直接用glDisable关闭之就可以了。

2.模板测试的代码解释:

2.1代码如下:

glStencilFunc(GL_ALWAYS,1,1);

glStencilOp(GL_KEEP,GL_KEEP,GL_REPLACE);

首先来解释这两个函数的用法:

(1).第一个函数glStencilFunc函数原型为:

void glStencilFunc(

GLenum func,

GLint ref, //参考值

GLuint mask //掩码通常为1

);

对于参数func可以用下面的表来解释:

常量含义

GL_NEVER 从不通过模板测试

GL_ALWAYS 总是通过模板测试

GL_LESS 只有参考值<(模板缓存区的值&mask)时才通过

GL_LEQUAL 只有参考值<=(模板缓存区的值&mask)时才通过

GL_EQUAL 只有参考值=(模板缓存区的值&mask)时才通过

GL_GEQUAL 只有参考值>=(模板缓存区的值&mask)时才通过

GL_GREATER 只有参考值>(模板缓存区的值&mask)时才通过

GL_NOTEQUAL 只有参考值!=(模板缓存区的值&mask)时才通过

该方法的作用为:将当前片元模板缓冲中的值与refmask比较,来确定哪些像素点可以通过模板测试。

(2).第二个函数glStencilOp,它的原型如下:

void glStencilOp(

GLenum fail, //模板测试失败时的动作

GLenum zfail, //深度测试失败时的动作

GLenum zpass //模板测试和深度测试都通过时的动作

);

常量描述:

GL_KEEP 保持当前的模板缓存区值

GL_ZERO 把当前的模板缓存区值设为0

GL_REPLACE glStencilFunc函数所指定的参考值替换模板参数值

GL_INCR 增加当前的模板缓存区值,但限制在允许的范围内

GL_DECR 减少当前的模板缓存区值,但限制在允许的范围内

GL_INVERT 将当前的模板缓存区值进行逐位的翻转

该方法的作用为:模板测试结束后,对模板缓冲区的操作。GL_REPLACE就是用参考值替换模板缓冲区的值。

2.2一般这样使用:

通过,下面两行代码将模板缓冲区的值全部设置为1,之后绘制模板物体。

GLES20.glStencilFunc(GLES20.GL_ALWAYS, 1, 1);

GLES20.glStencilOp(GLES20.GL_KEEP, GLES20.GL_KEEP, GLES20.GL_REPLACE);

此时,模板物体的在模板缓冲区中的模板值全部为1

下面代码之后,绘制模板上的物体。这样在模板缓冲中值为1的像素点上就会绘制上新的颜色值。

GLES20.glStencilFunc(GLES20.GL_ EQUAL, 1, 1);

GLES20.glStencilOp(GLES20.GL_KEEP, GLES20.GL_KEEP, GLES20.GL_KEEP);

3.原理:

在解释完这里的两个函数以后我们对于这里设定模板的一系列操作就非常清楚了。首先我们使得模板测试无论如何都会通过,并且我们设置当通过模板测试以后就用参考值1来代替原来缓存当中相应位置的值,这样在绘制一个模板区域以后这个区域的模板缓存的值全部为1,而不是这个区域的模板缓存的值保持为0。之后,就在模板值为1的位置上进行颜色值的绘制。


猜你喜欢

转载自blog.csdn.net/aiwusheng/article/details/8873025