使用 Direct3D9ex,可以在设备之间共享资源。是否也可以将这些共享资源与 Direct3D10 设备一起使用?
3 回答
是的,您可以使用此处描述的技术在 D3D9Ex 和 D3D10 设备之间共享资源:
功能总结(Direct3D 9 for Windows Vista)- 资源共享
请注意,GPU 对共享表面的访问是不同步的——例如,如果您同时在两台设备上渲染到相同的渲染表面,则预计会出现各种损坏和竞争。
要解决此问题,请确保一台设备在另一台设备使用它之前完成对共享表面的渲染。一种选择是事件查询(IDirect3DQuery9),另一种是对一个小表面做一个 StretchRect 并锁定它(如果锁定成功,GPU 完成了之前的所有工作)
您可以在设备或进程之间共享 Direct3D9 资源。
功能总结(Direct3D 9 for Windows Vista)- 资源共享
类似的技术适用于 Direct3D10 资源(您还可以指定共享句柄)。
这个GameDev.net 主题详细讨论了 D3D9Ex 和 D3D10 之间的共享。该主题的结论似乎是,虽然基于文档它应该是可能的(有一些限制),但在实践中它根本不起作用(也许限制非常严重,它们阻止了任何实际使用场景?)
如果我错了,请有人纠正我,但是,不,不。
你有什么打算?在两个设备上都有静态纹理?如果是这样,通过将相同的纹理两次加载到两个不同的默认池中很容易实现。请注意,修改一个不一定会修改另一个。
如果您尝试在两个设备上共享托管纹理,我认为这无法通过任何形式的控制来实现。SLI 可能会在幕后进行,但您无法控制它。
如果您想在另一个设备上显式使用从一个设备生成的纹理,则必须从源设备下载它并在每一帧将其上传到目标设备。这会很慢,但如果绝对必要,可以这样做。