突然看到這個函數(shù)。
HRESULT SetClipPlane( DWORD Index, CONST float * pPlane);
雖然DX SDK上面有,但還是有很多朋友不喜歡看那些拉丁字母,我也順便就記錄一下吧。
參數(shù):
第一個是索引,不用說了。
第二個是存著 A B C D的數(shù)組。
這個數(shù)組最后會用來構(gòu)建 Ax+By+Cz+Dw = 0;平面。
然后頂點會根據(jù)自已的位置(x,y,z,w)來進行判斷。如果Ax+By+Cz+Dw >= 0。則表示在平面前方,保留。反之則在后方,被裁剪掉。
值得注意的時,在固定管線使用平面裁剪的時候,是在世界坐標系中處理的。
而用SHADER的時候,是在裁剪空間中處理的。(即頂點輸出的時候的坐標系)
貌似還是太抽象。比如頂點輸入坐標是pos 此時的坐標變換陣是WVP,則 Output.pos = mul(pos,WVP); 那么,此時的裁剪空間就是Output.pos對應的坐標系空間。 另外,默認情況下D3DRS_CLIPPLANEENABLE 是沒有打開的,應該在SetRenderState中手工打開。
值得注意的是:D3DXPLANE進行矩陣變換的時候,要將需要乘的那個矩陣進行求逆和轉(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)如果你覺得不直觀的話,DX提供了以下一些生成PLANE的函數(shù)
D3DXPLANE * D3DXPlaneFromPoints(
D3DXPLANE * pOut,
CONST D3DXVECTOR3 * pV1,
CONST D3DXVECTOR3 * pV2,
CONST D3DXVECTOR3 * pV3
);

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

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