我正在尝试将网格切成两半,或者至少能够实时从中删除面。我想知道该怎么做?
锁定顶点缓冲区,memset 选定的面或顶点为 0,对我不起作用。有没有人对此有解决方案或教程我真的希望我的程序中有这个功能!
干杯
哦-那很容易。无需修改网格。D3D 已经可以为您做到这一点!
通过 设置剪切平面IDirect3DDevice9::SetClipPlane
,然后通过渲染状态启用该平面D3DRS_CLIPPLANEENABLE
。如果您愿意,您甚至可以同时设置多个剪切平面。
这是 msdn 条目的链接:http ://doc.51windows.net/Directx9_SDK/?url=/directx9_sdk/graphics/reference/d3d/interfaces/idirect3ddevice9/setclipplane.htm
如果你在“D3D SetClipPlane”上进行谷歌搜索,你会发现很多关于如何使用它的讨论和示例代码。
如果您需要从网格中动态删除三角形,最好/最快的方法是使用索引三角形。创建索引缓冲区时,请使用“D3DUSAGE_DYNAMIC”标志。当你想删除三角形时,用'D3DLOCK_DISCARD'标志锁定它。将整个新的索引列表写入缓冲区,忽略要删除的三角形。
索引缓冲区将比顶点缓冲区小得多,因此仅重新上传索引不会像顶点缓冲区那样对系统造成太大的拖累。但是,如果转换为索引三角形列表对您来说是一个大问题,那么使用顶点缓冲区执行这些 stame 操作可能是您的下一个最佳选择。
您说将顶点设置为 0 不起作用。以什么方式不起作用?
如果将三角形所有顶点的位置设置为 (0.0, 0.0, 0.0),则生成的三角形大小为零,不应绘制。只是为了确保您可以将其设置为屏幕外位置而不是零。