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

问题描述

我正在同一位置绘制两个不同的模板蒙版,并且希望我的蒙版 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);
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,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);
glStencilOp(GL_KEEP,GL_KEEP);  
glStencilMask(0x00);
glStencilFunc(GL_EQUAL,0xff);
DrawShape1();


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

glColorMask(GL_TRUE,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 时将 mask 设置为 1 或 2:

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

glColorMask(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,2,2);   // <----
DrawShape1();

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...