您的位置:首页 > 其它

关于模板缓存的一些试验

2009-12-26 20:50 225 查看
OPENGL的许多测试处处彰显着“伟大”的可操作性,最常见的ALPHA测试,裁剪测试,深度测试。。但是他们都各有用途,有一个模板测试,参数比较“复杂”。看了红皮书,也不得其解,红皮书搞那个例子真的不敢多说什么,确实很不具有代表性。网上google了一把,全是不透彻的理解(尤其是那些直接复制别人代码的朋友,我对其坚持误解的毅力表示由衷的赞赏~~)。毕竟这玩意儿是美国的SGI首发,还是老美的资料比较切实、能够深入本质。最后在OGL的官网(http://www.opengl.org/code)上找到了一些比较有用的资料。网址如下:
http://psysal.livejournal.com/67933.html http://www.opengl.org/resources/code/samples/sig99/advanced99/notes/node117.html http://www.opengl.org/sdk/docs/man/xhtml/glStencilFunc.xml
有兴趣的朋友自己去看吧,一定让你恍然大悟(如果你也对STENCIL有些模糊的话~)。

下面是我的测试总结:

首先,说说怎么使用(首先你的硬件(显卡)要支持STENCIL缓存)

1. WIN32像素格式,设置模板位/GLUT初始化显示模式或上GLUT_STENCIL

2. 设置刷新默认值:glClearStencil(0); // 我设为0,这个可以自己根据需要修改

3. 逐帧刷新:glClear或上GL_STENCIL

4. 在适当的地方启用模板缓存测试:glEnable(GL_STENCIL_TEST);

5. 根据需要设置模板值及模板测试结果操作: glStencilFun(func,val,mask); glStencilOp(failed,zfailed,zpass);

好了,要做的就这些,但是有些技巧需要了解:

首先,说说模板缓存的意义。为什么要有它,以及它产生的作用。我们知道裁剪测试用来划定显示范围,ALPHA测试通过颜色依赖进行显示过滤(结合混合可以实现更多效果),深度测试则是为了让3D物体根据Z值相互遮掩(故又称“Z-BUFFER”)。那么,当我要指定一个图元或图元集合作为我的过滤器(MASK)时,又该如何实现呢?前面的种种测试显然无法满足需求。于是,STENCIL就产生了。它和深度缓存比较像(可以理解为“某区域的深度缓存”,个人意见,呵呵~~)。OK,一切都明白了。(至于函数的使用及参数意义,可以参考上面的网址链接或红宝书)

其次,有时我们是不需要显示这个MASK的。使用过ADOBE产品的朋友应该对此比较了解(PS及AE里都有类似概念)。所以我们可以使用glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE)完全关闭向颜色缓冲区的写入操作(就是不显示任何颜色信息)。当你把模板MASK画好之后一定要记得还原过来,否则你的场景就全“黑”了。还有一个就是配合glDepthMask来控制对深度缓存的写入操作,来实现更多的效果。

开始试验:

当你明白了如何使用模板缓存,一切就可以随自己的喜欢去做。这里,我首先把背景模板值全刷为1,再将地面强行写入0,然后让茶壶大于1时通过测试。(当然,其他地方模板缓存是关闭的。并且我先绘制地面,然后绘制茶壶。)。效果如下:



很好,就这么简单~ 一切顺利,进入下一步,适当关闭地面的颜色写入(第一次留下红色分量,第二次全部关闭。)。效果如下:





嗯,就是这样。一切都和预期很一致。OK,现在我要把深度缓存的写入也关掉,以至于可以让地面下向上看时也能看到茶壶。这是不是很COOL~就像一道双面的魔法门。OK,效果如下:







呵呵,虽然达到了预期效果(实现了双面透视)。可这茶壶显得很奇怪,(呵呵,是啊,貌似没有深度检测似地)。那是因为我把深度写入关掉了,所以茶壶自身的深度也显得不正常了。OK,既然找到了问题。FIX IT!在glutSolidTeapot之前打开,之后再关掉。

然后,下面是效果图:(嗯,是这样~一切正常了)





OK,试验到此结束。呵呵,这个只是试验,很”朴素“呵。当然你可以用它制作出各种奇形怪状或出乎意料的组合,来实现各种镂空等等特效。~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: