问题: 需要与另一个进程共享SlimDx.Direct3D9.Surface,以便它可以显示渲染输出。我可以创建Surface,但我还没有找到在进程之间共享它的方法。
可用代码 我可以访问应用程序的两端,但提供渲染输出的应用程序是有限的。我无法访问设备的创建。我可以引用Direct3D9设备,创建渲染目标,并成功捕获输出。
更多详情
我有一种感觉,我会被指责不先看,但我可以向你保证,我必须尽我所能。
但是,我正在尝试将DirectX 9 Surface共享给另一个进程,以便我可以在外部表单中捕获渲染输出。
我在共享表面上发现了一些东西,但似乎没有弄清楚如何使用DirectX 9设备在2个进程之间共享表面。
我对DirectX设备的访问权限有限。我通过嵌入在应用程序中的内置脚本模块访问它。我无法知道创建属性或非公共变量的参数,但我确实可以完全访问设备本身。
所以使用下面的代码(为了证明我必须在大多数情况下使用)我试图弄清楚如何与另一个进程共享Surface,这样我就可以获得渲染器的输出了表格。
基本上,我的代码看起来像这样: 的(简化的)
byte[] ARGB;
//Getting internal access to renderer's Direct3D9.Device (Already created)
SlimDx.Direct3D9.Device dev = renderer.Device.Device;
//Surface I create to capture the devices output
SlimDx.Direct3D9.Surface destination;
//Create render target to device
destination = Surface.CreateRenderTarget(this.dev, this.w, this.h, Format.A8R8G8B8, MultisampleType.None, 0, true);
// 1. Render,
// 2. then grab snapshot (internal call),
// 3. convert to byte array (not relevant to what I'm currently doing)
if (this.renderer.Render())
{
board.Snapshot(this.destination); //some internal logic to get surface
try
{
using (DataStream data = destination.LockRectangle(LockFlags.ReadOnly).Data)
{
data.Read(ARGB, 0, (int) data.Length);
}
}
finally
{
this.destination.UnlockRectangle();
}
}
答案 0 :(得分:2)
要与directx9共享纹理,您的设备必须是以下类型:
SlimDX.Direct3D9.DeviceEx mydeviceex;
默认的directx9设备不支持共享资源。
然后您可以使用以下方式获取共享句柄:
IntPtr sharedhandle;
Texture texture = new Texture(mydeviceex, width, height, 1, Usage.RenderTarget,
format, Pool.Default, out sharedhandle);
1用于mipmap(共享资源必须只有一个级别)。 格式也有一些限制,A8R8G8B8在这种情况下很常见。