首先使用以下值绘制Geometry_A并写入模板缓冲区。
glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP); // replace stencil buffer values to ref=1
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glStencilFunc(GL_NEVER, 1, 0xFF); // never pass stencil test
glStencilMask(0xFF);
Draw Geometry_A
绘制Geometry_B并使用以下值写入模具缓冲区。
glStencilFunc(GL_NEVER, 2, 0xFF); // never pass stencil test
glStencilMask(0xFF);
Draw Geometry_B
绘制Geomtery_C比较Geometry_A的模板值
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glStencilFunc(GL_EQUAL, 1, 0xFF);
绘制Geomtery_D比较Geometry_B的模板值
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glStencilFunc(GL_EQUAL, 2, 0xFF);
我们是否可以绘制一个几何形状来比较Geometry_A和Geometry_B的模板缓冲区值
类似的东西。
glStencilFunc(GL_EQUAL, 1 & 2, 0xFF);
我们能否绘制一个几何图形,比较Geometry_A和Geometry_B的模板缓冲区值
是的,当然,只需在模板缓冲区中设置一个位,而不是更改所有位。
为几何Geometry_A设置位掩码0x01
glStencilFunc(GL_NEVER, 1, 0xFF); // never pass stencil test
glStencilMask(0x01);
设置几何Geometry_B的位掩码0x02
glStencilFunc(GL_NEVER, 2, 0xFF); // never pass stencil test
glStencilMask(0x02);
如果要查找已绘制Geometry_A和Geometry_B的部分,则必须查找测试模板缓冲区中是否设置了拳头 2 位。
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glStencilFunc(GL_EQUAL, 3, 0x03);
请注意,使用此方法时,位 3 到 8 根本不受影响。