OpenGL基础之Stencil Testing

stencil testing发生在fragment shader之后,depth testing之前,它利用stencil-buffer来舍弃一些片元,余下的会进入depth testing进行进一步的比较。

stencil buffer中每一个片元通常对应一个8bit的stencil value,也就是每一个像素或者片元可以设置256个不同的值,我们可以根据这些值来决定哪些片元可以保留,哪些可以舍弃。

OpenGL基础之Stencil Testing

我们可以在片元渲染的过程中,指定stencil-buffer中的值;在同一个渲染循环中,就可以读stencil buffer中的值,来保留或者舍弃一些片段,通常的流程如下:

1、开启写stencil-buffer

2、渲染物体,更新stencil-buffer

3、关闭写stencil-buffer

4、渲染物体,并根据stencil-testing结果舍弃一些片元

同样,可以通过glEnable(GL_STENCIL_TEST)来开启深度模板测试,并且需要每一帧都清空stencil-buffer:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

同时可以通过函数glStencilMask(0xff),来制定一个值与写入的值进行 ‘与’操作,如果设置为0x00,则写入的值永远为0;

Stencil functions

跟depth testing一样,我们可以指定stencil testing的比较函数,以此来决定片元的通过方式,用法是:

glStencilFunc(GLenum func, GLint ref, GLuint mask);

func:stencil test function,包括了GL_NEVER, GL_LESS, GL_LEQUAL, GL_GREATER, GL_GEQUSAL, GL_NOTEQUAL,GL_ALWAYS

ref:指定一个引用值,与stencil-buffer的内容进行比较

mask:指定mask值,在stencil test之前,先与stencil-buffer中的值和ref值进行‘与’操作

可以使用函数glStencilOp(GLenum sfail, GLenum dpfail,GLenum dppass)指定一些操作:

1、sfail:如果stencil test失败采取的操作;

2、dpfail:如果stencil test通过,但是depth test失败进行的操作;

3、dppass:如果stencil test和depth test都通过采取的操作;

这些操作的定义如下表:

OpenGL基础之Stencil Testing

本文转自:博客园 - 勤能补拙/山维世界,转载此文目的在于传递更多信息,版权归原作者所有。

--电子创新网--
粤ICP备12070055号