SharpDX: создайте D3D11.Texture2D от D3D10.Texture2D?
Я использую SharpDX и пытаюсь создать D3D11.Texture2D
, который указывает на те же данные, что и существующий D3D10.Texture2D
. Я думаю, что мне нужно получить DXGI.Surface
и использовать его для создания новой текстуры, но я всегда получаю эту бесполезную ошибку:
Значение HRESULT: [0x80070057], модуль: [неизвестен] ApiCode: [неизвестный/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);
}
}
Кажется, это работает. Это лучший способ сделать это?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); } }
Вот ответ на другой вопрос с более общей информацией о совместном использовании поверхностей между различными устройствами DirectX.