微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我正在同一位置绘制两个不同的模板蒙版,并且希望我的蒙版 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();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。