如何使用模板遮罩来遮罩多个对象

How to mask multiple objects using stencil masking

我在同一位置绘制两个不同的模板蒙版,我希望我的蒙版 1 只影响形状 1,蒙版 2 影响形状 2。

这是代码。

glClearStencil(0);
glStencilMask(~0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

// Render all stencil masks

// First geometry Mask
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP);  // replace stencil buffer values to ref=1
glStencilFunc(GL_NEVER, 1, 0xff); // never pass stencil test
glStencilMask(0xFF);
DrawGeometry1();


// Second geometry Mask
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP);  // replace stencil buffer values to ref=1
glStencilFunc(GL_NEVER, 2, 0xff); // never pass stencil test
glStencilMask(0xFF);
DrawGeometry2();

//Draw first shape to be masked by first geometry Mask

glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);  
glStencilMask(0x00);
glStencilFunc(GL_EQUAL, 1, 0xff);
DrawShape1();


//Draw first shape to be masked by fsecond geometry Mask

glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);  
glStencilMask(0x00);
glStencilFunc(GL_EQUAL, 2, 0xff);
DrawShape1();

这是工作流程

  1. 绘制两个面具。
  2. 绘制形状 1
  3. 绘制形状 2

形状 2 仅受几何遮罩 2 的影响,但首先绘制的形状 1 会同时受到两个遮罩的影响。

渲染蒙版后,模板缓冲区有 4 个可能的值:

  • 0 个注意的地方
  • 1 绘制遮罩 1 的位置
  • 2 绘制掩码 2 的位置
  • 3 画了两个面具

绘制形状时,只需考虑形状的蒙版即可。但是,这意味着您需要绘制模板缓冲区内容为 1 或 3 的形状 1,以及模板缓冲区内容为 2 或 3 的形状 2。
绘制形状 1 时只需要考虑模板缓冲区的第 1 位,绘制形状 2 时只需考虑缓冲区的第 2 位。

调用 glStencilFunc 时将 掩码 设置为 1 或 2:

//Draw first shape to be masked by first geometry Mask

glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);  
glStencilMask(0x00);
glStencilFunc(GL_EQUAL, 1, 1);   // <----
DrawShape1();


//Draw first shape to be masked by fsecond geometry Mask

glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);  
glStencilMask(0x00);
glStencilFunc(GL_EQUAL, 2, 2);   // <----
DrawShape1();