1:地板透明化(注:透明物體最后畫出)
g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE );
g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA );
g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
2:畫出反射對象(注:一份頂點數據通過矩陣變換畫出反射對象)
D3DXMATRIXA16 tmp;
D3DXMatrixScaling(&tmp,1,-1,1);//通過放縮矩陣來實現倒影(或D3DXMatrixReflect(&tmp,&plane);)
3:Stencil Buffer 模板緩存(啟用Stencil Buffer保證轉到地板下面時看不到實際存在的反射物體以免漏餡)
鏡面既要最先畫又要最后畫,那么畫兩遍,最先畫時設置Aphha混合如下不改變后臺緩存只是在模板緩存中標記鏡面區域為1.
最先畫地板時:
//設置模板緩存
g_pd3dDevice->SetRenderState(D3DRS_STENCILENABLE,true);
g_pd3dDevice->SetRenderState(D3DRS_STENCILFUNC,D3DCMP_ALWAYS);
g_pd3dDevice->SetRenderState(D3DRS_STENCILREF,0x1);
g_pd3dDevice->SetRenderState(D3DRS_STENCILMASK,0xffffffff);
g_pd3dDevice->SetRenderState(D3DRS_STENCILWRITEMASK,0xffffffff);
g_pd3dDevice->SetRenderState(D3DRS_STENCILZFAIL,D3DSTENCILOP_KEEP);
g_pd3dDevice->SetRenderState(D3DRS_STENCILFAIL,D3DSTENCILOP_KEEP);
g_pd3dDevice->SetRenderState(D3DRS_STENCILPASS,D3DSTENCILOP_REPLACE);
//繪制地板鏡面
g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, FALSE);
g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_ZERO);
g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ONE);
繪制物體影像時啟用模板緩存并對其函數狀態進行設置:
g_pd3dDevice->SetRenderState(D3DRS_STENCILENABLE,true);
g_pd3dDevice->SetRenderState( D3DRS_STENCILFUNC,D3DCMP_EQUAL);
最后在渲染時照常:
g_pd3dDevice->SetStreamSource( 0, obj.g_pVB, 0, sizeof(CUSTOMVERTEX) );
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->SetIndices( obj.g_pIB );
g_pd3dDevice->SetTexture( 0, g_pTexture[obj.textureID] ); //設置紋理
g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,obj.numOfVertex,0,obj.numOfFace);
其中 g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,obj.numOfVertex,0,obj.numOfFace);這句話根據模板緩存的設置及開啟情況,寫入后臺緩沖區的同時寫入模板緩存。或在與模板緩存中數據比較后決定是否要往后臺緩沖區中寫。
posted on 2008-05-17 19:25
天書 閱讀(1976)
評論(3) 編輯 收藏 引用