|
//禁用z缓冲区写操作, 并启用模板缓冲区
pd3dDevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE );
pd3dDevice->SetRenderState( D3DRS_STENCILENABLE, TRUE );
//只更新深度模板缓冲区
pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, true );
pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ZERO );
pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
//渲染阴影体前面
pd3dDevice->SetRenderState( D3DRS_STENCILFUNC, D3DCMP_ALWAYS );
pd3dDevice->SetRenderState( D3DRS_STENCILPASS, D3DSTENCILOP_INCR );
pd3dDevice->SetTransform( D3DTS_WORLD, pmatWorld );
pd3dDevice->SetFVF( D3DFVF_XYZ );
pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLELIST, m_dwNumVertices/3,
m_pVertices, sizeof(D3DXVECTOR3) );
//渲染阴影体背面
pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CW );
pd3dDevice->SetRenderState( D3DRS_STENCILPASS, D3DSTENCILOP_DECR );
pd3dDevice->SetTransform( D3DTS_WORLD, pmatWorld );
pd3dDevice->SetFVF( D3DFVF_XYZ );
pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLELIST, m_dwNumVertices/3,
m_pVertices, sizeof(D3DXVECTOR3) );
//恢复渲染状态
pd3dDevice->SetRenderState( D3DRS_SHADEMODE, D3DSHADE_GOURAUD );
pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW );
pd3dDevice->SetRenderState( D3DRS_ZWRITEENABLE, TRUE );
pd3dDevice->SetRenderState( D3DRS_STENCILENABLE, FALSE );
pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
上面是和渲染相关的代码,书上说绘制前面的时候模板缓冲去的内容加1,绘制反面的时候模板缓冲区的内容减1,如果最终模板缓冲区的内容大于1,就说明这个地方是阴影体内部。
其实我不理解的是,一个裁剪正面和裁剪背面有什么区别哪,无论正面还是反面应该都有相同的深度信息,上面的例子中模板缓冲又都是D3DCMP_ALWAYS,也就是说渲染成败的所有信息都是靠深度测试,但是如果正面和反面的深度又都是一样,那又是怎么区别是不是在阴影体内部啊,这个问题郁闷我很久了, 请大家指点下
[em7] |
|