突然看到這個(gè)函數(shù)。
HRESULT SetClipPlane( DWORD Index, CONST float * pPlane);
雖然DX SDK上面有,但還是有很多朋友不喜歡看那些拉丁字母,我也順便就記錄一下吧。
參數(shù):
第一個(gè)是索引,不用說(shuō)了。
第二個(gè)是存著 A B C D的數(shù)組。
這個(gè)數(shù)組最后會(huì)用來(lái)構(gòu)建 Ax+By+Cz+Dw = 0;平面。
然后頂點(diǎn)會(huì)根據(jù)自已的位置(x,y,z,w)來(lái)進(jìn)行判斷。如果Ax+By+Cz+Dw >= 0。則表示在平面前方,保留。反之則在后方,被裁剪掉。
值得注意的時(shí),在固定管線使用平面裁剪的時(shí)候,是在世界坐標(biāo)系中處理的。
而用SHADER的時(shí)候,是在裁剪空間中處理的。(即頂點(diǎn)輸出的時(shí)候的坐標(biāo)系)
貌似還是太抽象。比如頂點(diǎn)輸入坐標(biāo)是pos 此時(shí)的坐標(biāo)變換陣是WVP,則 Output.pos = mul(pos,WVP); 那么,此時(shí)的裁剪空間就是Output.pos對(duì)應(yīng)的坐標(biāo)系空間。 另外,默認(rèn)情況下D3DRS_CLIPPLANEENABLE 是沒(méi)有打開(kāi)的,應(yīng)該在SetRenderState中手工打開(kāi)。
值得注意的是:D3DXPLANE進(jìn)行矩陣變換的時(shí)候,要將需要乘的那個(gè)矩陣進(jìn)行求逆和轉(zhuǎn)置,再相乘。SDK中代碼如下
D3DXPLANE planeNew;
D3DXPLANE plane(0,1,1,0);
D3DXPlaneNormalize(&plane, &plane);

D3DXMATRIX matrix;
D3DXMatrixScaling(&matrix, 1.0f,2.0f,3.0f);
D3DXMatrixInverse(&matrix, NULL, &matrix);
D3DXMatrixTranspose(&matrix, &matrix);
D3DXPlaneTransform(&planeNew, &plane, &matrix);

上面的D3DXPLANE plane(0,1,1,0)如果你覺(jué)得不直觀的話,DX提供了以下一些生成PLANE的函數(shù)
D3DXPLANE * D3DXPlaneFromPoints(
D3DXPLANE * pOut,
CONST D3DXVECTOR3 * pV1,
CONST D3DXVECTOR3 * pV2,
CONST D3DXVECTOR3 * pV3
);

上面的PV1 PV2 PV3則是平面上的三個(gè)點(diǎn)。這個(gè)函數(shù)可以很容易地求得一個(gè)三角形所在的平面。
D3DXPLANE * D3DXPlaneFromPointNormal(
D3DXPLANE * pOut,
CONST D3DXVECTOR3 * pPoint,
CONST D3DXVECTOR3 * pNormal
);

pPoint為平面上的一個(gè)點(diǎn)。 pNormal是平面的法線方向。
比如,你想創(chuàng)建一個(gè)水平平面,并且朝上。 則可以將pPoint傳入0,0,0 而pNormal傳入0,1,0即可。