【发布时间】: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);
}
}
它似乎工作。这是最好的方法吗?
【问题讨论】: