平面阴隐其实就是将物体“压扁”到某一平面进行绘制。原理类似于投影
而对于一个三维物体来说,当多个部分投影到平面上时,会产生叠加效果,导致某一部位颜色较深,而此时我们可以通过模版缓存来防止二次融合,从而避免这类现象的产生。
Device->Clear(0,0,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL,0xfff0000,1.0,0);
Device->SetRenderState(D3DRS_STENCILENABLE,true);
Device->SetRenderState(D3DRS_STENCILFUNC,D3DCMP_EQUAL);
Device->SetRenderState(D3DRS_STENCILREF,0x0);
Device->SetRenderState(D3DRS_STENCILMASK,0xffffffff);
Device->SetRenderState(D3DRS_STENCILWRITEMASK,0xffffffff);
Device->SetRenderState(D3DRS_STENCILZFAIL,D3DSTENCILOP_KEEP);
Device->SetRenderState(D3DRS_STENCILFAIL,D3DSTENCILOP_KEEP);
Device->SetRenderState(D3DRS_STENCILPASS,D3DSTENCILOP_INCR);
首先开启模版,将测试规则设置为"相等",模版参考设置为0,失败时候不更改,成功的时候增加1.
由于我们已经将模版缓存清0 ,于是,当第一次写入模版的时候,测试总是成功的,模版值加1.而当第二次写入的时候,模版值与模版参考值不相等,测试便会失败,从而阻止了再次写入缓存.
Device->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
Device->SetRenderState(D3DRS_SCRBLEND,D3DBLEND_SCRALPHA);
Device->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCAPHA);
Device->SetRenderState(D3DRS_ZENABLE,false);
//使用D3DXMatrixShadow(&S,&linghtDirection,&groundplane);
//S为最后输出的矩阵,然后是光线方向,然后是要绘制阴影的平面
//绘制
//最后做收尾工作
Device->SetRenderState(D3DRS_ZENABLE,true);
Device->SetRenderState(D3DRS_ALPHABLENDENABLE,false);
Device->SetRenderState(D3DRS_STENCILENABLE,false);