OpenGL蒙板(转 Phil.Z's Program Blog)

本文详细介绍了OpenGL中蒙版的概念和应用,通过实例探讨了如何使用蒙版进行混合操作,内容涉及buffer、blend等关键技术和测试方法。
摘要由CSDN通过智能技术生成
一、蒙板
        蒙板是这样的一种机制,他用来控制深度在蒙板其后的物体,在蒙板区域的某个位置是否被显示。这个功能可以使用混色通过控制ALPHA通道的值来完成,但是这样的效果并不好,会产生蒙板上物体比较虚的效果。使用蒙板以后我们可以使得透过深度较靠前的物体看到深度较靠后物体的一个部分。 这个机制可以用两种方法来实现。
       第一种方式是使用模拟的方式,它的原理是使用混色当中的象素叠加操作。所以我们在操作的一开始必须要打开混色开关,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);
我们首先来解释这两个函数的用法:
第一个函数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)时才通过

第二个函数glStencilOp,它的原型如下:
void  glStencilOp(
  GLenum fail,                   
// 蒙板测试失败时的动作
  GLenum zfail,                   // 深度测试失败时的动作
  GLenum zpass                // 蒙板测试和深度测试都通过时的动作
);
这里可以采取的动作可以用下面的表来表示

常量
描述
GL_KEEP
保持当前的蒙板缓存区值
GL_ZERO
把当前的蒙板缓存区值设为0
GL_REPLACE
用glStencilFunc函数所指定的参考值替换
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值