【问题标题】:How to mask multiple objects using stencil masking如何使用模板遮罩遮罩多个对象
【发布时间】:2020-12-20 04:59:29
【问题描述】:

我在同一位置绘制两个不同的模板蒙版,并且希望我的蒙版 1 只影响 shape1,而蒙版 2 影响 shape 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 受到两个蒙版的影响。

【问题讨论】:

    标签: c++ opengl stencil-buffer


    【解决方案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();
    

    【讨论】:

    • 非常感谢,你仍然是摇滚明星。
    猜你喜欢
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    相关资源
    最近更新 更多