|
请教个问题,D3D中镜面反射
只有Stencil等于1的地方,才会绘制反射的物体
但是由于MESH的子集绘制顺序不确定
所以出现了不正确的画面
该如何解决
代码片段如下
-----------------------------------------------------------------------------------
//镜面反射的图案只会在stencil为1的地方绘制成功
HR(g_d3dDevice->SetRenderState(D3DRS_STENCILENABLE, true));
HR(g_d3dDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS));
HR(g_d3dDevice->SetRenderState(D3DRS_STENCILREF, 0x1));
HR(g_d3dDevice->SetRenderState(D3DRS_STENCILMASK, 0xffffffff));
HR(g_d3dDevice->SetRenderState(D3DRS_STENCILWRITEMASK, 0xffffffff));
HR(g_d3dDevice->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP));
HR(g_d3dDevice->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP));
HR(g_d3dDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_REPLACE));
//防止深度缓存和后台缓存被修改
HR(g_d3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, false));
HR(g_d3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true));
HR(g_d3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO));
HR(g_d3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE));
// 填充镜面的stencil缓存
DrawMirror();
HR(g_d3dDevice->SetRenderState( D3DRS_ZWRITEENABLE, true ));
HR(g_d3dDevice->SetRenderState(D3DRS_STENCILFUNC, 3DCMP_EQUAL));
HR(g_d3dDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP));
// 建立镜面反射矩阵
D3DXMATRIX R;
D3DXPLANE plane(0.0f, 0.0f, 1.0f, 0.0f); // xy平面
D3DXMatrixReflect(&R, &plane);
D3DXMATRIX oldFighterWorld = m_FighterWorld;
m_FighterWorld = m_FighterWorld * R;
//同样计算光照效果
DirLight oldLight = m_Light;
D3DXVec3TransformNormal(&m_Light.DirW, &m_Light.DirW, &R);
HR(m_Effect->SetValue(mh_Light, &m_Light,sizeof(DirLight)));
//忽略掉深度比较和alpha融合
HR(g_d3dDevice->SetRenderState(D3DRS_ZENABLE, false));
HR(g_d3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, false));
// 绘制背面
HR(g_d3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW));
DrawFighter(false);
m_FighterWorld = oldFighterWorld;
m_Light = oldLight;
// 恢复原有状态
HR(g_d3dDevice->SetRenderState(D3DRS_ZENABLE, true));
HR(g_d3dDevice->SetRenderState( D3DRS_STENCILENABLE, false));
HR(g_d3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW));
|
|