如何在地面上绘制几个立方体,然后他们各自的阴影在随着光照的不停变化,
他们各自的阴影也在变化,而且他们的阴影遇见其他的立方体时会自动拐弯,
也就是说,一个立方体的影子可以显示在另外一个立方体的其中一个面上,
当然是由于影子在运动过程中,碰到了其他的立方体的影响。
请大家给一个思路吧
 

解决方案 »

  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);
    // ÖÆ×÷ÿ¸ö·¿ÎݵÄÒõÓ°Ä£°å¡£ 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);
    }
    } 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);
    }
      

  2.   

    楼上的留个QQ吧,想详细问一下,谢谢了
    我的QQ:49561494
      

  3.   

    NEHE教程里好像是42课吧,有详细的例子.动态灯光+阴影
      

  4.   

    阴影锥是个理论的东西,十分符合你要的"一个立方体的影子可以显示在另外一个立方体的其中一个面上".但是这里不可能方的下的,你去查查那个关键字试试
    我个人觉得只要理论明白了,无论OpenGL还是D3D都是一个导入的问题了(大致上),当然,不可能忽视掉具体实现上的细节问题,祝你好运