模板缓冲区的使用

4.2 模板缓冲区的使用

    从图4可以看到,纹理贴图以后,滑块上有一部分白色区域覆盖了下一层的贴图,使得两个图片不能够很好地融合在一起,通过使用OpenGL中的模板缓冲技术可以解决这样的 问题,就是使用一个模板图案来渲染一个不规则的形状,将滑块上的白色区域去掉。
4.2.1 模板缓存
    在现实世界中,模板就是一块平的纸板或其它材料,模板缓存的用途之一,就是将绘图范围限制在屏幕的特定区域。模板缓存用来进行复杂的掩模(masking)操作。一个复杂的形状可以存储在模板缓存里,然后绘制子序列操作可以使用模板缓存里的 内容来决定是否更新象素。
4.2.2 使用模板缓存的操作方法
4.2.2.1 申请模板缓存区
    为了使用OpenGL的模板功能,首先必须使用平台特定的OpenGL设置过程请求一个模板缓存区。在以VC++.NET为基础的OpenGL平台中,是在设置像素格式时在PIXELFORMATDESCRIPTOR结构中指定的模板缓存,并且需要指定模板缓存的位数。如果使用GLUT,在初始化显示模式时请求一个模板缓存区,下面的代码设置了带模板缓存的双缓存RGB颜色缓存区:
    glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_STENCIL)。
4.2.2.2 模板测试
    现代硬件加速的OpenGL现实中,模板操作相对较为快速,但是仍然可以并且有必要使用glEnable/glDisable来及时打开和关闭模板测试功能。
    打开模板测试以后,绘图只在那些通过了模板测试的位置进行。在进行模板测试之前,指定要写入模板缓存区的清除值,通过函数glClearStencil来完成,函数原型为void glClearStencil(Glint s)。模板测试的设置可以通过下面的函数完成:
    void glStencilFunc(Glenum func,Glint ref,Gluint mask)。func参数的值是告诉OpenGL如何把已经存储在模板缓存中的与ref参数所指定的值进行比较。也可以指定一个掩码,在进行比较之前,将指定的掩码与ref值和模板缓存区中的值进行AND操作。
4.2.2.3 创建模板图案
    在绘图之前,要确保模板缓存区被清除,调用函数glClear()来清除缓存,函数原型为void glClear(Glbitfield mask),在清除操作中所使用的值是由前面的函数glClearStencil(Glint s)设置的。在启用了模板测试之后,就使用glStenceFunc函数的参数与存储在模板缓存区内的值进行测试。根据测试结果,值片段或者被写入,或者丢弃。模板缓存区本身在测试过程中也会进行修改,进入模板缓存区的值取决于如何调用glStencilOp函数:
    void glStenclOp(Glenum fail,Glenum zfail,Glenum zpass)。函数中的参数值告诉OpenGL如果模板测试失败,应该如何修改模板缓存区的值。接下来要创建模板图案,本文中所创建的模板图案是滑块中的白色区域,使用自定义函数void DrawMoveRheostat()来实现。
4.2.2.4 实现代码
    在本文中使用模板缓存来实现去除滑动变阻器滑块中的白色区域的实现代码如下所示:
    glDrawBuffer(GL_NONE);
    glEnable(GL_STENCIL_TEST);
    glClearStencil(0x1);
    glStencilFunc(GL_ALWAYS, 0x1, 0x1);
    glStencilOp(GL_ZERO, GL_ZERO, GL_ZERO);
    glClear(GL_STENCIL_BUFFER_BIT);
    DrawPolygon();
    glDrawBuffer(GL_BACK);
    glStencilFunc(GL_EQUAL, 0x0, 0x1);
    glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
    Draw(m_textureNames);
    glDisable(GL_STENCIL_TEST);
    其中Draw(m_textureNames)函数是自定义,完成对纹理图片的绘制,m_textureNames表示的是需要载入的纹理图片的文件名参数。实现效果如图5所示。
4.2.2.5 实现代码中的函数DrawPolygon()
    通过上面的 分析可以知道,使用模板缓存是为了去除滑块中的白色区域,而自定义函数DrawPolygon()在程序中的功能是用来创建模板图案,也就是在函数中绘制滑块中白色区域以外的那部分区域,这部分是一个不规则的多边形。OpenGL中多边形的创建规则,一是所有的多边形都必须是平面的,二是多边性的边必须不相交,并且多边形必须是凹的。根据第二个规则,函数DrawPolygon()中绘制的多边形必须是凸的,因此要把所要绘制的模板图案分解成多个凸多边形。绘制凸多边形使用glBegin(GL_POLYGON)/glEnd()来完成,glBegin()与glEnd()之间用来指定所要绘制的凸多边形的顶点坐标,而这些顶点坐标可以通过滑块的纹理图片来得到。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值