SlimDX DX9进程之间的共享表面。 (C#)

时间:2012-07-05 19:32:14

标签: c# winforms directx directx-9 slimdx

问题: 需要与另一个进程共享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();
    }
}

1 个答案:

答案 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在这种情况下很常见。