一直不知道那一堆長長的代碼是什么意思,今天上課無聊的時候就在那里想,一不留神就想通了,真是謝天謝地!
首先將模版緩存清空
Device->Clear( 0,
0,
D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL, //清空模版緩存,深度緩存
0ff000000,//顏色
1.0f,
0)//清空后的模版緩存值
//接下來就是模版緩存進(jìn)行設(shè)置
Device->SetRenderState(D3DRS_STENCILENABLE,true) //開啟模版緩存
Device->SetRenderState(D3DRS_STENCILFUNC,D3DCMP_ALWAYS);//將模版測試設(shè)置為總是成功,因為我們是在畫鏡面,不管鏡面如何,都要畫上去
Device->SetRenderState(D3DRS_STENCILREF,0x1);//設(shè)置模版參考值為1,這樣將會用0x1來標(biāo)記鏡面區(qū)域
Device->SetRenderState(D3DRS_STENCILMASK,0xffffffff);//設(shè)置模版掩碼,0xffffffff表示不屏蔽任何位
Device->SetRenderState(D3DRS_STENCILWRITEMASK,0xffffffff)//模版寫掩碼
Device->SetRenderState(D3DRS_STENCILPASS,D3DSTENCILOP_REPLACE);//當(dāng)模版測試成功時,便用模版參考值(0x1)去替換緩存中的值
Device->SetRenderState(D3DRS_ZWRITEENALBE,false);//關(guān)閉深處緩存的寫功能,以便阻止對深緩存的更改
Device->SetRenderState(D3DRS_ALPHABLENDENABLE,true);//開啟ALPHA混合功能
Device->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_ZERO);//將源融合因子設(shè)置為(0,0,0,0);
Device->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ONE);//將目標(biāo)融合因子設(shè)置為(1,1,1,1);
//在這里畫鏡面,此時的鏡面會通過模版緩存進(jìn)行繪制,并且模版緩存中的代表鏡面的部分被標(biāo)記為0x1,而其它區(qū)域為0;
//接下來就要繪制我們的物體了
Device->SetRenderState(D3DRS_ZWRITEEABLE,true);//重新開啟ZWRITE
Device->SetRenderState(D3DRS_STENCILFUNC,D3DCMP_EQUAL);//將模版測試規(guī)則設(shè)置為相等
Device->SetRenderState(D3DRS_STENCILZFAIL,D3DSTENCILOP_KEEP);
Device->SetRenderState(D3DRS_STENCILFAIL,D3DSTENCILOP_KEEP);//這兩排表示如果深度和模版測試失敗,則不對模版中的內(nèi)容作更改
Device->SetRenderState(D3DRS_STENCILPASS,D3DSTENCILOP_KEEP);//若測試成功也不對其作更改
//使用D3DXMatrixReflect(&R,&plane);求出物體的鏡像,其中plane為鏡面平面;
//若此時繪畫我們會看不到物體,因為物體的深度大于鏡面的深度,于是我們要清空深度緩存
Device->Clear(0,0,D3DCLEAR_ZBUFFER,0,1.0f,0);
//為了能達(dá)到物體在鏡子中的效果,我們依然要用到ALPHA混合
Device->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_DESTCOLOR);//(Rd,Gd,Bd,Ad)
Device->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ZERO);//(0,0,0,0);
//由于物體在鏡面中的顯示為物體的像,于是我們要變改鏡像繪制時的背面消隱模式
Device->SetRenderState(D3DRS_CULLMODE,D3DCULL_CW);//順時針
最后的工作就是繪制出你的物體,然后關(guān)閉開啟的功能,并恢復(fù)消隱模式
Device->SetRenderState(D3DRS_ALPHABLEND,false);
Device->SetRenderState(D3DRS_STENCILENABLE,false);
Device->SetRenderState(D3DRS_CULLMODE,CCW);//恢復(fù)默認(rèn)(逆時針)