随笔- 770 文章- 1 评论- 88

IDirect3DDevice9::SetClipPlane

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

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

第二个是存着 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即可。

附加一个讨论贴: http://topic.csdn.net/t/20040414/16/2964767.html

1.今天突然发现了这两个函数,看过了所有的remarks,好象这两个函数的功能就是根据当前设置的视锥体对所有被渲染的物体进行不可见物剔除。

既然D3D都提供了这样的功能,为什么还有这么多的人要去写什么场景管理器呢?

而且,D3D实现这个功能也许是直接在最底或者使用硬件什么的实现的,可能会比你手写的任何代码都要快,是这样吗?

很不明白中…………

2. 不是这样。你说的这两个函数是把整个场景都根据当前设置的视锥体对所有被渲染的物体进行不可见物剔除。这样的话有一些明显不需要计算的是否剔除的物体(比如在视点背后)都进行了是否剔除的计算,这样的计算是不必要的。
而场景管理器就是先把一些明显是要剔除的先计算出来,再交给D3D区剔除。
本人也是菜鸟,不知道对不对,请高手指教

3.我想大多数学习3D的人都是看重了这方面的技术有一定的含金量. 而不像写网页之类的IT高新技术那么... 场景管理可能是一个主要的技术指标, 大部分人遇到的第一个难题可能就是它了. 当然后面还有许多比如真实感, 动画, 物理模型之类的大类. 我想有些人虽然实现了场景管理, 但以后还对它进行修改, 扩展. 所以人们都喜欢写, 另外亲手做的话, 很多问题都会变的明朗化. 再说招聘的时候要求的技术条件都是要会场景管理的.
场景管理可以把物体或地形或多边形按空间顺序, 渲染状态顺序进行组织成树型结构. 我想D3D不会把场景组织成树型结构吧.

在遍历树型结构时,可以利用视锥(可以根据实际情况加视锥面)对树进行剪枝。这样有许多的根本不可能显示的物体,可能在树上面的几层就被剪掉了。

另外如果是树中有PORTAL或PVS的话, 实际上的树是一个图结构, 这样的话, 根本不用遍历整个树, 而只要找到CAMERA所在的结点, 然后按PORTAL这样的图结构中的边找到可能可见的部分, 当然其中的物体和PORTAL也要进行观察体可视检测. 这个实际上D3D可能更做不到了吧.

另外, 观察体(视锥)平面也是可以在3D中动态的增加, 减少的. 这一点的话D3D可能就更更不可能做到了吧?

4.ClipPlane是指除了视锥之外的、额外的裁剪面。关于场景管理的问题,需要知道:硬件再快,也需要和内存打交道。内存读写越多,硬件效率越差。场景管理的目的就是减少向图形硬件发送不必要的数据,减少内存的吞吐。GPU运算也需要时间,并不是硬件做就一定快。CPU和GPU协同、平衡处理才是最快的。

5.观察体(视锥)平面也是可以在3D中动态的增加, 减少的.
是什么意思?

6.室内PORTAL可能缩小观察体的范围. 这时就根据视点到PORTAL的各个边形成一个新的观察体.
室外的高大建筑可以遮挡观察体, 这时也可以增加平面, 缩小观察体的范围.

总结:视锥由6个平面组成,其中除了远近裁剪面之外还有其余上下左右四个面,上下左右四个面的裁剪由cpu计算,远近裁剪面定义的裁剪由gpu计算。 SetClipPlane定义的裁剪面也由gpu计算。

....SetClipPlane(0,...);
....SetClipPlane(1,...);
....SetClipPlane(2,...);
m_pd3dDevice-> SetRenderState( D3DRS_CLIPPLANEENABLE, D3DCLIPPLANE0 | D3DCLIPPLANE1 | D3DCLIPPLANE2);
RenderScene();
.....
pd3dDevice-> SetRenderState( D3DRS_CLIPPLANEENABLE, 0x00 ); 

IDirect3DDevice9::SetClipPlane相关推荐

  1. QT中IDirect3DDevice9的Present方法失败情况的处理笔记

    这几天在试着使用QT做编辑器,然后打算使用Irrlicht作为渲染引擎.结果在集成的时候遇到了问题. 使用了Irrlicht论坛里面有人提供的QIrrlichtWidget,结果什么都画不出来.仔细跟 ...

  2. Direct3D Devices

    这一章讲述了Direct3D的设备对象,它提供了渲染流水线的一个抽象层.流水线的操作是通过设备的属性方法配置的.渲染在设备上的图片是要么2D拷贝操作,要么通过三维场景渲染. 设备的属性和方法控制了整个 ...

  3. PS 1.x 中的寄存器

    译注:对于一个想学好着色器语言(不管是ASM还是HLSL.GLSL)的人来说,了解显卡中相应寄存器的功能和局限是必不可少的. 下面给出了PS 1.X中可用的寄存器的相关信息,希望能给大家带来帮助! 有 ...

  4. 【Visual C++】游戏开发笔记四十一 浅墨DirectX教程之九 为三维世界添彩:纹理映射技术(一)...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8523341 作者:毛星云(浅墨 ...

  5. DirectX 9的坐标系统变换

    http://www.cppblog.com/lovedday/archive/2007/05/04/23389.html DirectX 9的坐标系统变换 世界坐标系到摄影坐标系的变换 摄影坐标系的 ...

  6. D3D9学习笔记(四) 绘制

    1直接使用vertex buffer绘制 使用IDirect3DDevice9::DrawPrimitive绘制 HRESULT DrawPrimitive( [in]  D3DPRIMITIVETY ...

  7. RenderMonkey基本使用方法

    楔子: 差不多从年中开始由于工作需要,开始研究Direct3D,这是继大二开始自学DX开始,睽违了6年后再重新学习DX.虽然时间很久了,但是幸亏还是有点基础,所以上手还是比较顺利的.当然由于DX本身难 ...

  8. D3DPOOL(资源池)

    D3DPOOL定义了资源对应的内存类型,资源可以是texture surface, vertex buffer等,从内存的角度来看,资源有以下几种类型. D3DPOOL_DEFAULT D3DPOOL ...

  9. 最简单的视音频播放示例3:Direct3D播放YUV,RGB(通过Surface)

    上一篇文章记录了GDI播放视频的技术.打算接下来写两篇文章记录Direct3D(简称D3D)播放视频的技术.Direct3D应该Windows下最常用的播放视频的技术.实际上视频播放只是Direct3 ...

最新文章

  1. oracle日志分析产品,鼎甲技术应用:Oracle日志分析 之事务级精准恢复
  2. 【转】Source Insight 有用设置配置
  3. oracle中区间大小,Oracle的逻辑结构(表空间、段、区间、块)——总结
  4. securecrt是什么工具_比较一下几款常用的SSH工具
  5. ACM中Java使用总结
  6. fasync驱动异步通知机制
  7. java Statement与preparedStatement的区别
  8. java 全排序_Java排序算法全
  9. 前端面试之webpack面试常见问题
  10. 很好的开源UI框架Chico UI
  11. linux 蓝牙编程avrcp,bluetooth(蓝牙) AVRCP协议概念及代码流程解析
  12. 小米路由器显示DNS服务器设置错误,小米路由器dns异常怎么修复
  13. jQuery UI autocomplete
  14. 当你发现微信好友朋友圈是“一条杠”,你会把她、他删除吗?
  15. Coursera 机器学习 第9章(下) Recommender Systems 学习笔记
  16. 从MIXMAX概率模型理解Bayesian建模方法
  17. 【kafka】解决kafka-tool连接上kafka,brokers和topics不显示问题
  18. 送外卖优先级_【超新人\超现实】送外卖需要了解的那些事
  19. PicoZense TOF 深度摄像头技术参数 | AIRCamera,DCAM710,DCAM100
  20. python用input输入list_python怎么用input函数输入一个列表

热门文章

  1. qtitanribbon注册_点云平台之QtitanRibbon
  2. JAVA设置按钮无效_JAVA设置的按钮监听没有反应
  3. c语言遍历文件内容_C/C++编程笔记:C语言开发电脑益智游戏【扫雷】(源代码分享)...
  4. 虚拟服务器怎么进去,怎么进入虚拟主机
  5. python对文件的处理_python文件处理fileinput使用方法详解
  6. 计算机基础术语巧记,报考28个专业术语,你都知道吗?掌握这些才算入门!
  7. delphi 线程安全list_Java的中的集合(容器)-List
  8. 怎么用计算机弹是你,抖音带你去旅行怎么用计算器弹奏_抖音带你去旅行计算器乐谱_管理资源吧...
  9. 两个iphone怎么大量传照片_「唯物」传个视频到 iPhone,有了新方法
  10. java 判断一个词是不是成语_Java 判断字符串a和b是否互为旋转词