|
|
HRESULT CMyD3DApplication::Shadow()
{
m_pd3dDevice->SetRenderState(D3DRS_STENCILENABLE,true);
m_pd3dDevice->SetRenderState(D3DRS_STENCILFUNC,D3DCMP_EQUAL);
m_pd3dDevice->SetRenderState(D3DRS_STENCILREF,0x0);
m_pd3dDevice->SetRenderState(D3DRS_STENCILMASK,0xFFFFFFFF);
m_pd3dDevice->SetRenderState(D3DRS_STENCILWRITEMASK,0xFFFFFFFF);
m_pd3dDevice->SetRenderState(D3DRS_STENCILZFAIL,D3DSTENCILOP_KEEP);
m_pd3dDevice->SetRenderState(D3DRS_STENCILFAIL,D3DSTENCILOP_KEEP);
m_pd3dDevice->SetRenderState(D3DRS_STENCILPASS,D3DSTENCILOP_INCR);
//写入模板
m_pd3dDevice->SetRenderState(D3DRS_ZENABLE,false);
//计算指定模型的阴影矩阵
D3DXVECTOR3 vPoint(0,0,0);
D3DXVECTOR3 vNormal(0.0f,-1.0f,0.0f);
D3DXPLANE plane;
D3DXPlaneFromPointNormal( &plane, &vPoint, &vNormal ); //生成这个平面
//D3DXPLANE groundPlane(0.0f,-1.0f,0.0f,0.0f);
D3DXMATRIX s,W;
D3DXPLANE ground;
D3DXMatrixShadow(&s,&vecLightDir,&plane);
W = m_matHelicopterMatrix * s;
W = W * m_matTerrainMatrix;
m_pd3dDevice->SetTransform(D3DTS_WORLD,&W);
m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
m_pd3dDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
m_pd3dDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
D3DMATERIAL9 mtrl;
ZeroMemory(&mtrl,sizeof(mtrl));
mtrl.Ambient = mtrl.Diffuse = D3DXCOLOR(0.0f,0.0f,0.0f,0.0f);
mtrl.Diffuse.a = 0.5f;
//设置材质
m_pd3dDevice->SetMaterial(&mtrl);
m_pd3dDevice->SetTexture(0,0);
m_Teapot->DrawSubset(0);
m_pd3dDevice->SetRenderState(D3DRS_ZENABLE,true);
m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,false);
m_pd3dDevice->SetRenderState(D3DRS_STENCILENABLE,false);
return S_OK;
}
我在W = W * m_matTerrainMatrix;这里又多乘了个地板的矩阵,但是
我总想像书上那样产生,可是书上的就是不对劲。 |
|