一、蒙板
蒙板是这样的一种机制,他用来控制深度在蒙板其后的物体,在蒙板区域的某个位置是否被显示。这个功能可以使用混色通过控制ALPHA通道的值来完成,但是这样的效果并不好,会产生蒙板上物体比较虚的效果。使用蒙板以后我们可以使得透过深度较靠前的物体看到深度较靠后物体的一个部分。 这个机制可以用两种方法来实现。
第一种方式是使用模拟的方式,它的原理是使用混色当中的象素叠加操作。所以我们在操作的一开始必须要打开混色开关,glEnable(GL_BLEND);然后我们在需要的地方放置我们的蒙板,模板是一个黑白贴图,在需要透视的后方物体的地方这个贴图使用白色,而需要遮挡的地方我们使用黑色。在载入并绑定蒙板贴图以后我们控制混色方案为glBlendFunc(GL_DST_COLOR,GL_ZERO);这样贴图的黑色部分被贴至指定位置,而白色部分则没有被贴图。接着载入并绑定与蒙板对应的贴图,并且更换混色方案为glBlendFunc(GL_ONE,GL_ONE),然后贴图,这样的效果是仅仅将原先蒙板贴到场景中的部分贴上图。至此一个蒙板的使用完成。
第一种方式是使用模拟的方式,它的原理是使用混色当中的象素叠加操作。所以我们在操作的一开始必须要打开混色开关,glEnable(GL_BLEND);然后我们在需要的地方放置我们的蒙板,模板是一个黑白贴图,在需要透视的后方物体的地方这个贴图使用白色,而需要遮挡的地方我们使用黑色。在载入并绑定蒙板贴图以后我们控制混色方案为glBlendFunc(GL_DST_COLOR,GL_ZERO);这样贴图的黑色部分被贴至指定位置,而白色部分则没有被贴图。接着载入并绑定与蒙板对应的贴图,并且更换混色方案为glBlendFunc(GL_ONE,GL_ONE),然后贴图,这样的效果是仅仅将原先蒙板贴到场景中的部分贴上图。至此一个蒙板的使用完成。
第二钟方式使用了OpenGL当中的蒙板缓存。使用这种机制的方法是首先在创建场景时打开蒙板缓存。然后在需要的时候用glEnable允许蒙板缓存的使用。在完成以上的初始化工作以后我们可以开始使用蒙板缓存,在正式使用之前我们需要用蒙板缓存指定接下来允许进行绘图的地方。因此我们就需要向蒙板缓存当中写入关于这个区域的数据而写入的过程类似与绘制的过程。在写入这些数据之前为了保证这个写入的过程不会改写深度缓存和颜色缓存,我们必须要用glColorMask指定所有的颜色掩码为GL_FALSE来保证没有任何颜色被写入到颜色缓存,而对于深度缓存的操作则非常的简单直接用glDisable关闭之就可以了。然后开始写入蒙板缓存,写入的代码如下:
glStencilFunc(GL_ALWAYS,1,1);
glStencilOp(GL_KEEP,GL_KEEP,GL_REPLACE);
glStencilOp(GL_KEEP,GL_KEEP,GL_REPLACE);
我们首先来解释这两个函数的用法:
第一个函数glStencilFunc,它的原型如下:
void
glStencilFunc(
GLenum func,
GLint ref , // 参考值
GLuint mask // 掩码 通常为1
);
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)时才通过
|
第二个函数glStencilOp,它的原型如下:
void
glStencilOp(
GLenum fail, // 蒙板测试失败时的动作
GLenum zfail, // 深度测试失败时的动作
GLenum zpass // 蒙板测试和深度测试都通过时的动作
);
GLenum fail, // 蒙板测试失败时的动作
GLenum zfail, // 深度测试失败时的动作
GLenum zpass // 蒙板测试和深度测试都通过时的动作
);
这里可以采取的动作可以用下面的表来表示
常量
|
描述
|
GL_KEEP
|
保持当前的蒙板缓存区值
|
GL_ZERO
|
把当前的蒙板缓存区值设为0
|
GL_REPLACE
|
用glStencilFunc函数所指定的参考值替换
|