绘制一个对象,比较模具缓冲区的两个不同值

Draw a object comparing two different values of stencil buffer

本文关键字:两个 一个对象 比较 缓冲区 绘制      更新时间:2023-10-16

首先使用以下值绘制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_AGeometry_B的模板缓冲区值

类似的东西。

glStencilFunc(GL_EQUAL, 1 & 2, 0xFF);

我们能否绘制一个几何图形,比较Geometry_AGeometry_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_AGeometry_B的部分,则必须查找测试模板缓冲区中是否设置了拳头 2 位。

glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glStencilFunc(GL_EQUAL, 3, 0x03);

请注意,使用此方法时,位 3 到 8 根本不受影响。