麒麟子

~~

导航

<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

统计

常用链接

留言簿(12)

随笔分类

随笔档案

Friends

WebSites

积分与排名

最新随笔

最新评论

阅读排行榜

评论排行榜

平面阴隐(用模版缓存防止二次融合)

平面阴隐其实就是将物体“压扁”到某一平面进行绘制。原理类似于投影
而对于一个三维物体来说,当多个部分投影到平面上时,会产生叠加效果,导致某一部位颜色较深,而此时我们可以通过模版缓存来防止二次融合,从而避免这类现象的产生。
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);

 

posted on 2009-04-18 10:02 麒麟子 阅读(356) 评论(0)  编辑 收藏 引用 所属分类: DirectX


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理