Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用模具遮罩遮罩多个对象_C++_Opengl_Stencil Buffer - Fatal编程技术网

C++ 如何使用模具遮罩遮罩多个对象

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

我正在同一位置绘制两个不同的模具蒙版,希望蒙版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

  • 形状2仅受几何体遮罩2的影响,但首先绘制的形状1受两个遮罩的影响。

    渲染遮罩后,模具缓冲区有4个可能的值:

    • 0,其中绘制了注释
    • 1其中绘制了遮罩1
    • 2其中绘制了遮罩2
    • 3在绘制两个遮罩的位置
    绘制形状时,只需考虑形状的遮罩。但是,这意味着您需要绘制模具缓冲区内容为1或3的形状1,以及模具缓冲区内容为2或3的形状2。
    在绘制形状2时,只需考虑模具缓冲区的第一位,而只需绘制缓冲区的第二位。

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

    //绘制要被第一个几何图形遮罩的第一个形状
    GLCOLORSMASK(GL_真、GL_真、GL_真、GL_真);
    glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP);
    glStencilMask(0x00);
    
    glStencilFunc(GL_等于,1,1);//非常感谢,你仍然是摇滚明星。