见如下代码及分析——//初始化
glClearStencil(0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);//启用模板缓存
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_NEVER,0x0,0x0);
glStencilOp(GL_INCR,GL_INCR,GL_INCR);//用如下代码画了一个三维物体
glEnable(GL_LIGNTING);
glEnable(GL_LIGNT0);
//...设置光照参数
DrawObject();
glEnable(GL_LIGNT0);
glDisable(GL_LIGHTING);//按照上面的设置,代表该三维物体区域的模板缓冲区值为1,背景为0glStencilFunc(GL_NOTEQUAL,0x1,0x1);
glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP);glColor3f(1.0f,1.0f,1.0f);
glBegin(GL_QUADS);
//...此处画一个与上面那个三维物体相交的白色矩形
glEnd();那么理论上在这个平面上的那些背景区域(模板值为0)能通过模板测试,被画成白色矩形.
而那些与三维物体相交的平面上像素则不能通过测试,这些像素用背景色代替那么结果应该是会出现这个矩形平面与那个三维物体的截面形状才对!
但是为什么只出现了一个白色矩形呢?看不到相交的部分?另,我将DrawObject()用一些简单的画线函数取代之后,则能出现理论上的效果。不知道是怎么一回事了,各位请指点一二!

解决方案 »

  1.   

    模板缓存挺复杂的,给一段代码作为参考。 if(pDoc->Env.bHouseShading)
    { glClearStencil(0);
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
    /// glColor3f(0.0f,0.0f,0.0f);
    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);
    /// glEnable(GL_BLEND);
    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);
    /// glEnable(GL_LIGHT0);
    DrawObjectAll(); glStencilFunc(GL_EQUAL, 0x00, 0xffffffff); // draw lit part //
    glEnable(GL_LIGHT0);
    DrawObjectAll(); glDepthFunc(GL_LESS);
    glDisable(GL_STENCIL_TEST);
    }