2011-01-12 37 views
5

我寫了一些使用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

回答

3

您是否在SlimDX WPF示例中使用了一些此代碼?它看起來像你可能有,這就是爲什麼你的Clear()調用使用0.0f的Z清除值...這是我們的示例中的錯誤。它應該是1.0f。

除此之外,我看到的唯一潛在問題是您的表面渲染目標與您的後臺緩衝區大小不同,但實際上並不會導致問題。您是否嘗試過渲染設備的後臺緩衝區(Device.GetBackBuffer())而不是新的表面以查看其影響?

2

在您的device.Clear調用中,將第一個數字參數從0f更改爲1f。這是從0到1範圍內的z深度。將z深度有效地指定爲無效。