IDirect3DDevice9::SetClipPlane

HRESULT SetClipPlane(
   DWORD   Index ,
   CONST float *   pPlane
);

虽然DX SDK上面有,但还是有很多朋友不喜欢看那些拉丁字母,我也顺便就记录一下吧。

参数:
第一个是索引,不用说了。

第二个是存着 A B C D的数组。
这个数组最后会用来构建 Ax+By+Cz+Dw = 0;平面。

然后顶点会根据自已的位置(x,y,z,w)来进行判断。如果Ax+By+Cz+Dw >= 0。则表示在平面前方,保留。反之则在后方,被裁剪掉。

值得注意的时,在固定管线使用平面裁剪的时候,是在世界坐标系中处理的。


而用SHADER的时候,是在裁剪空间中处理的。(即顶点输出的时候的坐标系)
貌似还是太抽象。比如顶点输入坐标是pos   此时的坐标变换阵是WVP,则 Output.pos = mul(pos,WVP);  那么,此时的裁剪空间就是Output.pos对应的坐标系空间。
 

另外,默认情况下D3DRS_CLIPPLANEENABLE 是没有打开的,应该在SetRenderState中手工打开。 

值得注意的是:D3DXPLANE进行矩阵变换的时候,要将需要乘的那个矩阵进行求逆和转置,再相乘。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的函数
D3DXPLANE  *  D3DXPlaneFromPoints(
  D3DXPLANE 
*  pOut,
  CONST D3DXVECTOR3 
*  pV1,
  CONST D3DXVECTOR3 
*  pV2,
  CONST D3DXVECTOR3 
*  pV3
);

上面的PV1 PV2 PV3则是平面上的三个点。这个函数可以很容易地求得一个三角形所在的平面。

D3DXPLANE  *  D3DXPlaneFromPointNormal(
  D3DXPLANE 
*  pOut,
  CONST D3DXVECTOR3 
*  pPoint,
  CONST D3DXVECTOR3 
*  pNormal
);

 

pPoint为平面上的一个点。 pNormal是平面的法线方向。
比如,你想创建一个水平平面,并且朝上。 则可以将pPoint传入0,0,0  而pNormal传入0,1,0即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值