2

SharpDXを使用してD3D11.Texture2Dいて、既存のと同じデータを指すを作成しようとしていますD3D10.Texture2D。新しいテクスチャを作成するには、を取得して使用する必要があると思いますが、DXGI.Surface常にこの役に立たないエラーが発生します。

HRESULT:[0x80070057]、モジュール:[Unknown]、ApiCode:[Unknown / Unknown]、メッセージ:パラメーターが正しくありません。

コンパイルしても機能しない現在のコードは次のとおりです。

private D3D11.Texture2D CreateD3D11Texture2D(D3D10.Texture2D d3d10Texture2D)
{
    var texDesc = new D3D11.Texture2DDescription
    {
        ArraySize = 1,
        BindFlags = D3D11.BindFlags.ShaderResource | D3D11.BindFlags.UnorderedAccess,
        CpuAccessFlags = D3D11.CpuAccessFlags.None,
        Format = DXGI.Format.B8G8R8A8_UNorm,
        Height = d3d10Texture2D.Description.Height,
        MipLevels = 1,
        OptionFlags = D3D11.ResourceOptionFlags.None,
        SampleDescription = new DXGI.SampleDescription(1, 0),
        Usage = D3D11.ResourceUsage.Default,
        Width = d3d10Texture2D.Description.Width
    };

    SharpDX.DataRectangle dataRectangle;
    using (var surface = d3d10Texture2D.QueryInterface<DXGI.Surface>())
    {
        int pitch = d3d10Texture2D.Description.Width
            * (int)DXGI.FormatHelper.SizeOfInBytes(d3d10Texture2D.Description.Format);
        dataRectangle = new SharpDX.DataRectangle(surface.NativePointer, pitch);
    }

    return new D3D11.Texture2D(this.d3d11Device, texDesc, dataRectangle);
}

アップデート

異なるDirectXデバイス間でサーフェスを共有する方法の概要を説明する答えに出くわしました。それに基づいて、D3D11.Texture2Dからを取得する正しい方法D3D10.Texture2Dは、リソースインターフェイスを取得してを呼び出すことだと思いますOpenSharedResource()

そうすることで、私の機能がかなり単純化されます。

private D3D11.Texture2D CreateD3D11Texture2D(D3D10.Texture2D d3d10Texture2D)
{
    using (var resource = d3d10Texture2D.QueryInterface<DXGI.Resource>())
    {
        return this.d3d11Device.OpenSharedResource<D3D11.Texture2D>(resource.SharedHandle);
    }
}

うまくいくようです。それが最善の方法ですか?

4

1 に答える 1

4

複数のテクスチャ間でデータを共有するには、DXGI.Resourceインターフェイスを取得してから、を呼び出しますOpenSharedResource()。SharpDXでそれを行う方法は次のとおりです。

private D3D11.Texture2D CreateD3D11Texture2D(D3D10.Texture2D d3d10Texture2D)
{
    using (var resource = d3d10Texture2D.QueryInterface<DXGI.Resource>())
    {
        return this.d3d11Device.OpenSharedResource<D3D11.Texture2D>(resource.SharedHandle);
    }
}

これは、異なるDirectXデバイス間でサーフェスを共有することに関するより一般的な情報を含む別の質問への回答です。

于 2013-03-22T21:40:35.437 に答える