2011-01-12 9 views
5

Ho scritto del codice usando SlimDX e WPF dove mi aspetterei che il risultato finale fosse una schermata rossa.SlimDX e WPF via D3DImage

Purtroppo tutto ciò che ottengo è uno schermo nero.

Questo è su Windows 7.

Chiunque può vedere qualcosa di importante che mi manca?

Il motivo per cui sto utilizzando una superficie separata come backbuffer per il D3DImage è che avrò bisogno di più finestre. Ho pensato che il rendering su superfici separate invece dei dispositivi iniziali di backbuffer sarebbe il modo migliore per farlo.

comunque, avanti con il codice ..

Disclaimer: Si prega di ignorare il codice cattivo, questo è scritto interamente in codice e getta solo così riesco a capire come fare a raggiungere quello che sto cercando .

Ecco la mia classe di finestra:

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); 
     } 
    } 
} 

Ed ecco il mio "renderer" classe

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(); 
     } 
    } 
} 

- Modifica: Per un secondo ho pensato che avevo risolto, ma sembra che funzionerà solo quando il mio secondo target di rendering (quello che sto cercando di cancellare in rosso) è 640x480. qualche idea?

+0

Hai controllato che 'image.PixelWidth' e' image.PixelHeight' stanno restituendo un valore diverso da zero? Non riesco a vedere dove stai impostando la dimensione di 'D3DImage' (non lo penso otterrà la dimensione dal buffer posteriore per te, ma potrebbe essere sbagliato!) – Samuel

+0

Infatti, recupera dalla superficie che assegno come un backbuffer. Una delle prime cose che ho controllato :) – Sekhat

risposta

3

Hai basato questo codice sull'esempio di SlimDX WPF? Sembra che tu possa avere, motivo per cui la tua chiamata Clear() sta usando 0.0f per il valore Z clear ... che è un bug nel nostro esempio. Dovrebbe essere 1.0f.

Oltre a ciò, l'unico problema potenziale che vedo è che il target di rendering di superficie ha una dimensione diversa da quella del buffer posteriore, ma ciò non dovrebbe causare problemi. Hai provato a eseguire il rendering sul backbuffer del dispositivo (Device.GetBackBuffer()) anziché su una nuova superficie per vedere quale impatto ha?

+0

Eri vicino. Quindi ti segnerò come corretto. La dimensione del buffer di profondità/stencil era diversa dalla dimensione del mio rendering. Non ha gradito cancellare sia la profondità che il buffer di destinazione quando entrambi erano di dimensioni diverse. Ha senso :) – Sekhat

2

Nel dispositivo. Chiamata chiara, modificare il primo argomento numerico da 0f a 1f. Questa è la profondità di z che va da 0 a 1. Specificare una profondità di z pari a 0 non fa nulla.