您的位置:首页 > 运维架构

蒙板缓存和蒙板测试

2015-08-27 18:10 239 查看
当你使用glEnable(GL_STENCIL_TEST)启用蒙板测试之后,蒙板函数用于确定一个颜色片段是应该丢弃还是保留(被绘制)。蒙板缓存区中的值与参考值ref进行比较,比较标准是func所指定的比较函数。参考值和蒙板缓存区的值都可以与掩码进行为AND操作。蒙板测试的结果还导致蒙板缓存区根据glStencilOp函数所指定的行为进行修改。

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 sfail, GLenum zfail, GLenum zpass),各个参数的含义如下:
sfail

当蒙板测试失败时所执行的操作

zfail

当蒙板测试通过,深度测试失败时所执行的操作

zpass

当蒙板测试通过,深度测试通过时所执行的操作

具体的操作包括以下几种
常量描述
GL_KEEP保持当前的蒙板缓存区值
GL_ZERO把当前的蒙板缓存区值设为0
GL_REPLACE用glStencilFunc函数所指定的参考值替换蒙板参数值
GL_INCR增加当前的蒙板缓存区值,但限制在允许的范围内
GL_DECR减少当前的蒙板缓存区值,但限制在允许的范围内
GL_INVERT将当前的蒙板缓存区值进行逐位的翻转
当完成了以上操作后我们绘制一个地面,当然现在你什么也看不到,它只是把覆盖地面的蒙板缓存区中的相应位置设为1。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opengl