directx9-directx11共享纹理创建失败SharpDX



我有一个wpf应用程序,正试图从渲染到winforms控件切换到使用d3dimage渲染到图像上(因为我想能够在渲染图像、空域问题等问题上放置一些wpf接口(,所以我知道我需要创建directx 9设备并创建共享纹理,我正试图效仿其他人的做法,但由于某些原因,共享纹理创建失败(但不仅仅是directx 9纹理,只有当我将directx 11纹理的句柄传递给它的构造函数时(,我尝试为directx 9或directx 11使用硬件和参考设备,我尝试调整格式、创建标志,但没有任何帮助,遵循了这里描述的所有限制https://learn.microsoft.com/ru-ru/windows/win32/api/d3d11/nf-d3d11-id3d11device-opensharedresource?redirectedfrom=MSDN仍然没有结果,有什么想法吗?xaml:

<Window x:Class="WPFReflectionTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">
<Grid>
<WindowsFormsHost>
<wf:Control x:Name="WinFormsControl"/>
</WindowsFormsHost>
</Grid>
</Window>

cb:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
SharpDX.Direct3D11.Device device = new SharpDX.Direct3D11.Device(DriverType.Hardware, DeviceCreationFlags.None | DeviceCreationFlags.BgraSupport, FeatureLevel.Level_11_0);
SharpDX.Direct3D11.Texture2D texture = new SharpDX.Direct3D11.Texture2D(device, new Texture2DDescription()
{
Width = WinFormsControl.ClientSize.Width,
Height = WinFormsControl.ClientSize.Height,
ArraySize = 1,
BindFlags = BindFlags.RenderTarget,
Usage = ResourceUsage.Default,
CpuAccessFlags = CpuAccessFlags.None,
Format = SharpDX.DXGI.Format.R8G8B8A8_UNorm,
MipLevels = 1,
OptionFlags = ResourceOptionFlags.Shared,
SampleDescription = new SampleDescription(1, 0)
});
Direct3DEx d9context = new Direct3DEx();
DeviceEx d9device = new DeviceEx(d9context,
0,
DeviceType.Hardware,
IntPtr.Zero,
CreateFlags.HardwareVertexProcessing | CreateFlags.Multithreaded | CreateFlags.FpuPreserve,
new SharpDX.Direct3D9.PresentParameters()
{
Windowed = true,
SwapEffect = SharpDX.Direct3D9.SwapEffect.Discard,
DeviceWindowHandle = WinFormsControl.Handle,
PresentationInterval = PresentInterval.Immediate,
});
IntPtr renderTextureHandle = texture.QueryInterface<SharpDX.DXGI.Resource>().SharedHandle;
SharpDX.Direct3D9.Texture d9texture = new SharpDX.Direct3D9.Texture(d9device,
  texture.Description.Width,
  texture.Description.Height,
  1,
  SharpDX.Direct3D9.Usage.RenderTarget,
  SharpDX.Direct3D9.Format.A8B8G8R8,
  Pool.Default,
  ref renderTextureHandle);
}

将directx9 3d设备创建为Direct3DEx,将directx9device创建为device(无Ex(,并在directx9和directx11设备中使用硬件设备类型解决了问题,没有任何其他组合起作用,以下是我的工作代码:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
SharpDX.Direct3D11.Device device = new SharpDX.Direct3D11.Device(DriverType.Hardware, 
DeviceCreationFlags.Debug | DeviceCreationFlags.BgraSupport, 
FeatureLevel.Level_11_0);
SharpDX.Direct3D11.Texture2D texture = new SharpDX.Direct3D11.Texture2D(device, new Texture2DDescription()
{
Width = WinFormsControl.ClientSize.Width,
Height = WinFormsControl.ClientSize.Height,
ArraySize = 1,
BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource,
Usage = ResourceUsage.Default,
CpuAccessFlags = CpuAccessFlags.None,
Format = SharpDX.DXGI.Format.B8G8R8A8_UNorm,
MipLevels = 1,
OptionFlags = ResourceOptionFlags.Shared,
SampleDescription = new SampleDescription(1, 0)
});

SharpDX.Direct3D9.Direct3DEx d9context = new SharpDX.Direct3D9.Direct3DEx();

SharpDX.Direct3D9.Device d9device = new SharpDX.Direct3D9.Device(d9context,
0,
DeviceType.Hardware,
IntPtr.Zero,
CreateFlags.HardwareVertexProcessing,
new SharpDX.Direct3D9.PresentParameters()
{
   Windowed = true,
   SwapEffect = SharpDX.Direct3D9.SwapEffect.Discard,
   DeviceWindowHandle = WinFormsControl.Handle,
   PresentationInterval = PresentInterval.Default,
});

IntPtr renderTextureHandle = texture.QueryInterface<SharpDX.DXGI.Resource>().SharedHandle;
SharpDX.Direct3D9.Texture d9texture = new SharpDX.Direct3D9.Texture(d9device,
  texture.Description.Width,
  texture.Description.Height,
  1,
  SharpDX.Direct3D9.Usage.RenderTarget,
  SharpDX.Direct3D9.Format.A8R8G8B8,
  Pool.Default,
  ref renderTextureHandle);
}

最新更新