0

問題: SlimDx.Direct3D9.Surfaceを別のプロセスと共有して、レンダリング出力を表示できるようにする必要があります。Surfaceを作成することはできますが、プロセス間で共有する方法が見つかりません。

利用可能なコード アプリケーションの両側にアクセスできますが、レンダリング出力を提供するアプリケーションは制限されています。デバイスの作成にアクセスできません。Direct3D9デバイスを参照し、レンダリングターゲットを作成して、出力を正常にキャプチャできます。

詳細

私は最初に見ていなかったと非難されるだろうと感じていますが、私は私の能力の限りを尽くしてあなたに保証することができます。

ただし、DirectX 9サーフェスを別のプロセスと共有して、外部フォーム内でレンダリング出力をキャプチャできるようにしようとしています。

共有サーフェスでいくつかのことを見つけましたが、2つのプロセス間でサーフェスを共有するDirectX9デバイスでそれを行う方法を理解していないようです。

DirectXデバイス自体へのアクセスが制限されています。アプリケーションに組み込まれている組み込みのスクリプトモジュールを介してアクセスしています。パブリック変数ではない作成プロパティまたはパラメーターを知るオプションはありませんが、デバイス自体に完全にアクセスできます。

したがって、以下のコードを使用して(ほとんどの部分で何を処理する必要があるかを正確に示すために)、そのフォームでレンダラーの出力を取得できるように、そのサーフェスを別のプロセスと共有する方法を見つけようとしています。

基本的に、私は次のようなコードを持っています:( 簡略化)

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はミップマップ用です(共有リソースには1つのレベルのみが必要です)。フォーマットにもいくつかの制限があります。その場合、A8R8G8B8が非常に一般的です。

于 2012-09-02T11:13:37.413 に答える