+ -
当前位置:首页 → 问答吧 → 问一个模版缓存的问题

问一个模版缓存的问题

时间:2011-12-01

来源:互联网

关于模版实现体积阴影的方法,看了这么多,还是很模糊,希望有人给讲解下.

C/C++ code

//根据轮廓边和光源位置构造阴影体
......

//渲染地形和飞机模型
......

//渲染阴影体前面
    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 );

......

//渲染阴影
//关闭深度测试, 启用Alpha混合
    pd3dDevice->SetRenderState( D3DRS_ZENABLE,          false );
    pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, true );
    pd3dDevice->SetRenderState( D3DRS_SRCBLEND,  D3DBLEND_SRCALPHA );
    pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );

    //设置模板相关渲染状态
    pd3dDevice->SetRenderState( D3DRS_STENCILENABLE,    true );
    pd3dDevice->SetRenderState( D3DRS_STENCILREF,  0x1 );
    pd3dDevice->SetRenderState( D3DRS_STENCILFUNC, D3DCMP_LESSEQUAL );
    pd3dDevice->SetRenderState( D3DRS_STENCILPASS, D3DSTENCILOP_KEEP );

    //渲染一个灰色矩形, 只有通过模板测试的像素才会被渲染到颜色缓冲区,表示阴影
    pd3dDevice->SetFVF( SHADOWVERTEX::FVF );
    pd3dDevice->SetStreamSource( 0, g_pBigSquareVB, 0, sizeof(SHADOWVERTEX) );
    pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );

    //恢复渲染状态
    pd3dDevice->SetRenderState( D3DRS_ZENABLE,          true );
    pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, false );
    pd3dDevice->SetRenderState( D3DRS_STENCILENABLE,    false );


模版测试是针对当前渲染的所有的像素进行的么?
为什么这里阴影体要绘制2遍呢?绘制完后模版值是多少呢?

我感觉自己完全乱了,求解啊!!!

作者: tonywya   发布时间: 2011-12-01

友情帮顶

作者: peng_weida   发布时间: 2011-12-03

热门下载

更多