SlimDX和WPF通过D3DImage

问题描述:

我写了一些使用SlimDX和WPF的代码,我期望最终的结果是一个红色的屏幕。SlimDX和WPF通过D3DImage

不幸的是,我得到的只是一个黑屏。

这是在Windows 7上。

任何人都可以看到我失踪的任何主要内容吗?

我使用单独表面作为D3DImage的后缓冲器的原因是我将需要多个视口。我认为渲染到单独的表面而不是设备的初始backbuffer将是实现这一目标的最佳方式。

无论如何,在与代码..

声明:请忽略坏的代码,这是完全写成扔掉的代码,这样我可以计算出如何做到实现我后我。

这里是我的窗口类:

namespace SlimDXWithWpf 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     SlimDXRenderer controller; 

     public MainWindow() 
     { 
      InitializeComponent(); 
      controller = new SlimDXRenderer(); 
      controller.Initialize(); 

      D3DImage image = new D3DImage(); 

      image.Lock(); 
      controller.RenderToSurface(); 
      image.SetBackBuffer(D3DResourceType.IDirect3DSurface9, controller.SurfacePointer); 
      image.AddDirtyRect(new Int32Rect(0, 0, image.PixelWidth, image.PixelHeight));    
      image.Unlock(); 

      Background = new ImageBrush(image); 
     } 
    } 
} 

而且我的继承人 “渲染” 类

namespace SlimDXWithWpf 
{ 
    public class SlimDXRenderer : IDisposable 
    { 
     Direct3DEx directX; 
     DeviceEx device; 
     Surface surface; 
     Surface backBuffer; 
     IntPtr surfacePointer; 

     public IntPtr SurfacePointer 
     { 
      get 
      { 
       return surfacePointer; 
      } 
     } 

     public void Initialize() 
     { 
      directX = new Direct3DEx(); 

      HwndSource hwnd = new HwndSource(0, 0, 0, 0, 0, 640, 480, "SlimDXControl", IntPtr.Zero); 

      PresentParameters pp = new PresentParameters() 
      { 
       BackBufferCount = 1, 
       BackBufferFormat = Format.A8R8G8B8, 
       BackBufferWidth = 640, 
       BackBufferHeight = 480, 
       DeviceWindowHandle = hwnd.Handle, 
       PresentationInterval = PresentInterval.Immediate, 
       Windowed = true, 
       SwapEffect = SwapEffect.Discard    
      }; 



      device = new DeviceEx(directX, 0, DeviceType.Hardware, hwnd.Handle, CreateFlags.HardwareVertexProcessing, pp); 
      backBuffer = device.GetRenderTarget(0); 

      surface = Surface.CreateRenderTarget(device, 1024, 768, Format.A8R8G8B8, MultisampleType.None, 1, false); 
      surfacePointer = surface.ComPointer;    
     } 

     public void RenderToSurface() 
     { 
      device.SetRenderTarget(0, surface); 
      device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, new Color4(Color.Red), 0f, 0); 
      device.BeginScene();    
      device.EndScene();       
     } 

     public void Dispose() 
     { 
      surface.Dispose(); 
      device.Dispose(); 
      directX.Dispose(); 
     } 
    } 
} 

- 编辑:因为我原以为我会解决它,但它第二似乎它只会在我的第二个渲染目标(我试图清除红色的目标)为640x480时才起作用。有什么想法吗?

+0

你是否检查过`image.PixelWidth`和`image.PixelHeight`返回一个非零值 - 我看不到你设置D3DImage的大小(我不认为它将会从后台缓冲区中为你获得大小,但可能是错误的!) – Samuel 2011-01-13 12:45:30

+0

它实际上从我指定为backbuffer的表面获取它。我检查的第一件事之一:) – Sekhat 2011-01-13 14:37:37

您是否在SlimDX WPF示例中使用了一些此代码?它看起来像你可能有,这就是为什么你的Clear()调用使用0.0f的Z清除值...这是我们的示例中的错误。它应该是1.0f。

除此之外,我看到的唯一潜在问题是您的表面渲染目标与您的后台缓冲区大小不同,但实际上并不会导致问题。您是否尝试过渲染设备的后台缓冲区(Device.GetBackBuffer())而不是新的表面以查看其影响?

在您的device.Clear调用中,将第一个数字参数从0f更改为1f。这是从0到1范围内的z深度。将z深度有效地指定为无效。