如果实现物体之间的阴影效果。我的场景中有多个物体,和几个光源,我该如果计算物体之间的阴影效果。
我有一个例子是如果实现几个物体在墙上和地板的阴影效果,但是真实的物体不一定是平面的。阴影的Matrix不是固定的。这种的物体该如何考虑。如果知道那个物体是在另一个物体前(相对光)。甚至是相交的两个物体。我的例子在这方面是预知物体的位置。在实际应用中就不一样了。
直接把深度检测关闭了是不行的。希望有兴趣的朋友一起探讨一下。

解决方案 »

  1.   

    这个我原来做过,是利用模板缓存的原理,建立每个实体的模板缓存,反正挺麻烦的,下面考几段代码供参考,有些兄弟反对贴代码,我到觉得代码是最好的语言,就是看起来费劲些。 if(pDoc->Env.bHouseShading)
    { 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);
    glDisable(GL_LIGHT0);
    DrawObjectAll(); /// render scene in depth buffer
    glDepthMask(GL_FALSE); glEnable(GL_STENCIL_TEST);
    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);
    }
      

  2.   

    // ÖÆ×÷ÿ¸ö·¿ÎݵÄÒõÓ°Ä£°å¡£ 2004.2.13.
    void HouseShadingStencil_p(CBoolArray& LightDirectionArray,
    long lNumPoint, long lFaces, GLuint& m_iShadowList)
    {
    int i; // m = PolyLine3D.Point3DArray.GetSize();
    // m1 = PolygonRoofList.GetCount();
    /// glDepthMask(GL_FALSE);
    if(LightDirectionArray.GetSize()<1) //2004.2.12.&ETH;&THORN;&cedil;&Auml;&iexcl;&pound;
    {
    return;
    // i = i;
    }
    for(i=0;i<lFaces;i++)
    {
    // if(i<0)continue;
    // if(i>0)break;

    if(i<lNumPoint)
    if(!LightDirectionArray[i])continue;
    /// if(i<m-1)continue;
    /// if(i>m-1)break;
    // glGetIntegerv(GL_STENCIL_VALUE_MASK, &j);
    // glGetIntegerv(GL_STENCIL_REF, &j);
    // glStencilMask(0x1);
    // glStencilFunc(GL_ALWAYS, 0x1, 0xffffffff);
    // glGetIntegerv(GL_STENCIL_VALUE_MASK, &j);
    // glGetIntegerv(GL_STENCIL_REF, &j);
    /// glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);

    glStencilFunc(GL_ALWAYS, 0x1, 0xffffffff);
    glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
    glCullFace(GL_BACK); /* increment using front face of shadow volume */
    glCallList(m_iShadowList+i);
    // glGetIntegerv(GL_STENCIL_VALUE_MASK, &j);
    // glGetIntegerv(GL_STENCIL_REF, &j);

    // if(i<m-1)
    {
    glStencilFunc(GL_EQUAL, 0x01, 0xffffffff);
    // glGetIntegerv(GL_STENCIL_VALUE_MASK, &j);
    // glGetIntegerv(GL_STENCIL_REF, &j);
    // glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO);
    // glStencilFunc(GL_NOTEQUAL, 0, 0xffffffff);
    glStencilOp(GL_KEEP, GL_KEEP, GL_DECR);
    glCullFace(GL_FRONT); /* increment using front face of shadow volume */
    glCallList(m_iShadowList+i);
    // glGetIntegerv(GL_STENCIL_VALUE_MASK, &j);
    // glGetIntegerv(GL_STENCIL_REF, &j);
    }/// glStencilMask(0x2);
    /// glStencilFunc(GL_ALWAYS, 0x1, 0xffffffff);
    // glGetIntegerv(GL_STENCIL_VALUE_MASK, &j);
    // glGetIntegerv(GL_STENCIL_REF, &j);
    /// glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
    // glStencilMask(~0u);
    // glGetIntegerv(GL_STENCIL_VALUE_MASK, &j);
    // glGetIntegerv(GL_STENCIL_REF, &j);
    /// glCullFace(GL_BACK); /* increment using front face of shadow volume */
    /// glCallList(m_iShadowList+i);
    }
    }
      

  3.   

    楼上这些方面可能满足不了楼主,同时效率是极其低的.一般的OGL中绘制阴影的方法只做学习用,
    真正用在场景或游戏中的都用NV SDK来做,
    CG.DLL,很多游戏引擎中都是这样用的,实时阴影,
    楼主不妨去找些免费引擎代码看看
      

  4.   

    目前主流的实时阴影算法就两种,shadowvolume和shadowmap,google search一下就清楚了,例子代码多的是。