【问题标题】:SharpDX: Create a D3D11.Texture2D from D3D10.Texture2D?SharpDX:从 D3D10.Texture2D 创建 D3D11.Texture2D?
【发布时间】:2013-03-21 19:33:04
【问题描述】:

我正在使用 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);
}

更新

我遇到了一个概述 how to share surfaces between different DirectX devices 的答案。基于此,我认为从D3D10.Texture2D 获取D3D11.Texture2D 的正确方法是获取资源接口并调用OpenSharedResource()

这样做大大简化了我的功能:

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

它似乎工作。这是最好的方法吗?

【问题讨论】:

    标签: directx sharpdx


    【解决方案1】:

    要在多个纹理之间共享数据,获取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);
        }
    }
    

    Here's an answer 回答另一个问题,其中包含有关在不同 DirectX 设备之间共享表面的更多一般信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-24
      相关资源
      最近更新 更多