用opengl的画圆柱函数画两个圆柱两个圆柱进行布尔运算,用摸板缓存计算出两个圆柱的差,进行绘制。glCullFace(GL_BACK);
            glDepthFunc(GL_LESS); 
            glDepthMask(GL_FALSE);
            glStencilFunc(GL_ALWAYS,stencilCode,~0);
            glStencilOp(GL_KEEP,GL_KEEP,GL_REPLACE);
           
            shape->draw();
           
            glDepthFunc(GL_GREATER);//GL_GREATER GL_GEQUAL
            glDepthMask(GL_TRUE); 
glCullFace(GL_FRONT); 
            glStencilFunc(GL_EQUAL,stencilCode,~0);
            glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP);
            shape->draw();
现在的问题是摸板缓存测试的通过点并写入深度缓存,全在多边形的边上。多边形的面上点没通过,这是为什么。增加多边形可以表现出圆柱被挖去一块,可多边形很多,影响速度
  

解决方案 »

  1.   

    glEnable(GL_STENCIL_TEST);
    glStencilFunc(GL_ALWAYS, 1, 2); //第一个值必须为1才有效// Always Passes, 1 
                                        //Bit Plane, 1 As Mask
    glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
    glDisable(GL_DEPTH_TEST);shape->draw();
    glEnable(GL_DEPTH_TEST);
    glColorMask(1,1,1,1);// Was Drawn)
    glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); // 不改变Stencil Buffer
    glLightfv(GL_LIGHT0, GL_POSITION, LightPosition);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); shape->draw();
      

  2.   

    opengl摸板缓存,挺麻烦的。
    if(pDoc->Env.bHouseShading)
    {
    /* glClearStencil(127);
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
    glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);
    DrawObjectAll(); /// render scene in depth buffer
    glDepthMask(GL_FALSE); glEnable(GL_STENCIL_TEST);
    glStencilFunc(GL_ALWAYS, 127, 127);
    glEnable(GL_CULL_FACE);
    glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
    glCullFace(GL_BACK);
    pDoc->DataBlock.DrawHouseShading(pDoc->Env); glStencilOp(GL_KEEP, GL_KEEP, GL_DECR);
    glCullFace(GL_FRONT);
    pDoc->DataBlock.DrawHouseShading(pDoc->Env); glCullFace(GL_BACK);
    glDisable(GL_CULL_FACE);
    glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glDepthMask(GL_TRUE);
    glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
    glDepthFunc(GL_LEQUAL);
    glStencilFunc(GL_NOTEQUAL, 127, 127); // draw shadowed part //
    glDisable(GL_LIGHT0);
    DrawObjectAll(); glStencilFunc(GL_EQUAL, 127, 127); // draw lit part //
    glEnable(GL_LIGHT0);
    DrawObjectAll(); glDepthFunc(GL_LESS);
    glDisable(GL_STENCIL_TEST); */ glClearStencil(0);
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
    glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);
    DrawObjectAll(); /// render scene in depth buffer
    glDepthMask(GL_FALSE); glEnable(GL_STENCIL_TEST);
    /* glStencilFunc(GL_ALWAYS, 127, 127);
    glEnable(GL_CULL_FACE);
    glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
    glCullFace(GL_BACK);
    pDoc->DataBlock.HouseShadingVolume(pDoc->Env); glStencilOp(GL_KEEP, GL_KEEP, GL_DECR);
    glCullFace(GL_FRONT);
    pDoc->DataBlock.HouseShadingVolume(pDoc->Env);*/
    pDoc->DataBlock.MakeShadingStencil(pDoc->Env); glCullFace(GL_BACK);
    glDisable(GL_CULL_FACE);
    glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
    glDepthMask(GL_TRUE);
    glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
    glDepthFunc(GL_LEQUAL);
    glStencilFunc(GL_NOTEQUAL, 0x00, 0xffffffff); // draw shadowed part //
    glDisable(GL_LIGHT0);
    DrawObjectAll(); glStencilFunc(GL_EQUAL, 0x00, 0xffffffff); // draw lit part //
    glEnable(GL_LIGHT0);
    DrawObjectAll(); glDepthFunc(GL_LESS);
    glDisable(GL_STENCIL_TEST);
    }
    拷一段程序,供参考