IDirect3DDevice9::SetClipPlane
2014-02-22 14:24
337 查看
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中代码如下
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
D3DXPLANE planeNew;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
D3DXPLANE plane(0,1,1,0);
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
D3DXPlaneNormalize(&plane, &plane);
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
D3DXMATRIX matrix;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
D3DXMatrixScaling(&matrix, 1.0f,2.0f,3.0f);
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
D3DXMatrixInverse(&matrix, NULL, &matrix);
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
D3DXMatrixTranspose(&matrix, &matrix);
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
D3DXPlaneTransform(&planeNew, &plane, &matrix);
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
上面的D3DXPLANE plane(0,1,1,0)如果你觉得不直观的话,DX提供了以下一些生成PLANE的函数
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
D3DXPLANE * D3DXPlaneFromPoints(
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
D3DXPLANE * pOut,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
CONST D3DXVECTOR3 * pV1,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
CONST D3DXVECTOR3 * pV2,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
CONST D3DXVECTOR3 * pV3
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
);
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
上面的PV1 PV2 PV3则是平面上的三个点。这个函数可以很容易地求得一个三角形所在的平面。
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
D3DXPLANE * D3DXPlaneFromPointNormal(
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
D3DXPLANE * pOut,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
CONST D3DXVECTOR3 * pPoint,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
CONST D3DXVECTOR3 * pNormal
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
);
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
pPoint为平面上的一个点。 pNormal是平面的法线方向。
比如,你想创建一个水平平面,并且朝上。 则可以将pPoint传入0,0,0 而pNormal传入0,1,0即可。
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中代码如下
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
D3DXPLANE planeNew;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
D3DXPLANE plane(0,1,1,0);
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
D3DXPlaneNormalize(&plane, &plane);
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
D3DXMATRIX matrix;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
D3DXMatrixScaling(&matrix, 1.0f,2.0f,3.0f);
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
D3DXMatrixInverse(&matrix, NULL, &matrix);
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
D3DXMatrixTranspose(&matrix, &matrix);
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
D3DXPlaneTransform(&planeNew, &plane, &matrix);
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
上面的D3DXPLANE plane(0,1,1,0)如果你觉得不直观的话,DX提供了以下一些生成PLANE的函数
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
D3DXPLANE * D3DXPlaneFromPoints(
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
D3DXPLANE * pOut,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
CONST D3DXVECTOR3 * pV1,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
CONST D3DXVECTOR3 * pV2,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
CONST D3DXVECTOR3 * pV3
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
);
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
上面的PV1 PV2 PV3则是平面上的三个点。这个函数可以很容易地求得一个三角形所在的平面。
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
D3DXPLANE * D3DXPlaneFromPointNormal(
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
D3DXPLANE * pOut,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
CONST D3DXVECTOR3 * pPoint,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
CONST D3DXVECTOR3 * pNormal
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
);
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
pPoint为平面上的一个点。 pNormal是平面的法线方向。
比如,你想创建一个水平平面,并且朝上。 则可以将pPoint传入0,0,0 而pNormal传入0,1,0即可。
相关文章推荐
- IDirect3DDevice9::SetClipPlane
- IDirect3DDevice9::SetClipPlane
- Set up your own ClipBucket on windows
- setMasksToBounds 与clipToBounds
- J2ME中setClip的用法
- J2ME小Tip:setClip方法的使用详解
- osg::ClipNode与osg::ClipPlane
- osgEarth矢量裁剪案例 38. feature_clip_plane.earth
- Android clipboard setPrimaryClip
- MovieClip.setMask()
- 裁剪平面ClipPlane
- Android clipboard setPrimaryClip
- Graphics的setClip与clipRect的区别
- J2ME小tip:setClip方法的使用
- J2ME小Tip:setClip方法的使用详解
- Directx11教程十六之ClipPlane(裁剪面)
- J2ME小tip:setClip方法的使用
- J2ME游戏开发学习之用setClip分割图片
- 解决AnimationClip.SetCurve RectTransform Color参数 出现Missing!的情况
- setClip方法的使用