写在前面
上一节介绍了深度测试,本节继续学习一个高级主题-模板测试(stencil testing)。模板缓冲同之前介绍的颜色缓冲、深度缓冲类似,通过它我们可以实现很多的特效,例如轮廓、镜面效果,阴影效果等。本节示例程序均可以从我的github下载。
通过本节可以了解到
- 模板缓冲的作用
- 模板缓冲的使用方法-简单的矩形模板
- 模板缓冲实现的outline和refleciton效果
模板缓冲的作用
上一节介绍的深度缓冲用于进行深度测试,决定场景中物体的表面是否可见,解决隐藏面消除的问题,简而言之,就是通过深度测试,OpenGL选择性渲染片元。模板测试的是另外一种可以以一定标准丢弃片元的方法,这个标准就是借助模板缓冲和我们指定的测试函数而运作的。实际上渲染管线里面包括几种测试,如下图所示(来自Improving Shadows and Reflections via the Stencil Buffer):
我们这里展开上面图中所有内容,但是我们看到模板测试是在深度测试之前进行的,可以作为一种丢弃片元的辅助方法。
模板缓冲的使用
模板缓冲一般为8位的,存贮整数,最大值为255。在使用的过程中步骤一般时,开启模板缓冲,绘制一个物体作为我们的模板,这个过程实际上就是写入模板缓冲的过程;接着我们利用模板缓冲中的值决定是丢弃还是保留后续绘图中的片元。下面我们建立一个举行模板,通过矩形模板选择性地将上一节绘制的场景显示出来,这个过程示意如下图所示(来自Stencil testing):
如图中所示,模板缓冲中为1的地方我们选择保留图形,而其他部分则丢弃,形成最终的效果。
使用模板缓冲需要三个要素:
- 正确的时间开启和关闭深度缓冲
- 模板测试函数
- 模板测试函数失败或者成功后的执行的动作
在OpenGL中开启模板缓冲的方法如下:
glEnable(GL_STENCIL_TEST);
同时和深度缓冲一样,需要清除,默认清除时写入0,可以通过glClearStencil设置清除的指定值。
glClearColor(0.18f, 0.04f, 0.14f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
一般地绘制模板以及利用模板选择性地绘制物体时则开启模板缓冲,绘制其他物体时关闭模板缓冲。使用模板缓存的步骤一般如下:
- 开启模板测试
- 绘制模板,写入模板缓冲(不写入color buffer和depth buffer)
- 关闭模板缓冲写入
- 利用模板缓冲中的值,绘制后续场景
与模板测试相关的函数
glStencilMask 函数用于控制模板缓