OpenGL学习笔记——StencilBuffer
发表于2018-03-03
StencilBuffer是模板缓冲,可以用来实现一些诸如描边,遮罩之类的操作。但考虑到有些初学者对StencilBuffer并不是很了解,为此,下面就给大家详细介绍下。
使用StencilBuffer,分为两大部分:
1、创建stencil Buffer 部分
- 创建Stencil,用其他模型,遮罩等的片段,去创建stencil buffer。(遮罩也完全可以不被显示出来,只更新模板)
- 打开stencilbuffer的写入 glStencilMask(0xFF) ,用某些模型,或遮罩图片,写入缓冲。
2、使用Stencil Buffer 部分:利用创建好的Stencil去和需要被遮罩处理的片段比较,去决定目标片段是否被保留。
比如描边的例子:
1、创建缓冲的部分:
打开stencilbuffer的写入和深度测试,以正常的绘制模型和写入模板。
写入原始模型的片段(绘图),同时写入stencilbuffer(创建Mask)
2、使用缓冲的部分
关闭stencilbuffer写入,防止模板为污染
关闭Z-test,将描边画在最上面。
将原始模型放大一点,改用单色shader(描边色)
当模板值不是1的时候,写入单色(中间有原模型的部位,不会被写入。没有原模型的部位,被写入。)
注意整体绘制顺序,因为关闭ZBuffer之后,后画的一定会覆盖先画的。
glStencilMask 打开关闭模板写入
(*)直白的说
glStencilMask(0xFF) 使得模板可以写入
glStencilMask(0x00)使得 模板完全不可写入。注意:他不是关闭模板,而是不让模板被写入,关闭模板的话连判断都没了。
glStencilFunc 决定片段去留
(**)glStencilFunc(GLenum func, GLint ref, GLuint mask) 直白的说他决定一个片段的去留——是否会显示在屏幕上。通过测试则显示,否则不显示。
glStencilOp 决定片段如何改变模板
(***)判断达成某些条件的片段,要如何更新模板。glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass) 这个是目标的判断满足哪种条件,进行哪种操作的设置函数。
参数[1]未通过模板和深度测试
参数[2]通过模板,但是未通过深度测试参数
参数[3]二者都通过了。
直白的说这个函数决定一个片段,是否并如何改变一个模板上的值。