C++ 如何使用模具遮罩遮罩多个对象
我正在同一位置绘制两个不同的模具蒙版,希望蒙版1只影响形状1,蒙版2影响形状2 这是代码C++ 如何使用模具遮罩遮罩多个对象,c++,opengl,stencil-buffer,C++,Opengl,Stencil Buffer,我正在同一位置绘制两个不同的模具蒙版,希望蒙版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_FAL
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();
这就是工作流程
形状2仅受几何体遮罩2的影响,但首先绘制的形状1受两个遮罩的影响。渲染遮罩后,模具缓冲区有4个可能的值:
- 0,其中绘制了注释
- 1其中绘制了遮罩1
- 2其中绘制了遮罩2
- 3在绘制两个遮罩的位置
在绘制形状2时,只需考虑模具缓冲区的第一位,而只需绘制缓冲区的第二位。 调用时将掩码设置为1或2:
//绘制要被第一个几何图形遮罩的第一个形状
GLCOLORSMASK(GL_真、GL_真、GL_真、GL_真);
glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP);
glStencilMask(0x00);
glStencilFunc(GL_等于,1,1);//非常感谢,你仍然是摇滚明星。