0

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

1 回答 1

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

于 2012-09-02T11:13:37.413 回答