2011-01-12 40 views
5

Ich habe Code geschrieben mit SlimDX und WPF, wo ich erwarten würde, dass das Endergebnis ein roter Bildschirm sein würde.SlimDX und WPF über D3DImage

Leider bekomme ich nur einen schwarzen Bildschirm.

Diese auf Fenster ist 7.

jemand Haupt nichts sehen kann ich fehle?

Der Grund, warum ich eine separate Oberfläche als Backbuffer für die D3DImage verwende, ist, dass ich mehrere Viewports brauche. Ich dachte, das Rendern auf separate Oberflächen anstelle des anfänglichen Backpuffers der Geräte wäre der beste Weg, dies zu erreichen.

wie auch immer, auf dem Code ..

Haftungsausschluss: Bitte geben Sie den schlechten Code ignorieren, wird diese vollständig als Wegwerf-Code geschrieben, so kann ich herausfinden, wie erreichen zu tun, was mich nach .

Hier ist meine Fensterklasse:

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

Und heres meine "Renderer" Klasse

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

- Edit: Eine Sekunde lang dachte ich, ich hatte es gelöst hatte, aber es Scheint, dass es nur funktioniert, wenn mein zweites Renderziel (dasjenige, das ich versuche, rot zu löschen) 640x480 ist. Irgendwelche Gedanken?

+0

Haben Sie überprüft, dass 'image.PixelWidth' und' image.PixelHeight' einen Wert ungleich null zurückgeben - ich kann nicht sehen, wo Sie die Größe des 'D3DImage' einstellen (ich glaube nicht wird die Größe aus dem Back-Puffer für Sie bekommen, könnte aber falsch sein!) – Samuel

+0

Es tatsächlich von der Oberfläche bekomme ich als Backbuffer zuweisen. Eines der ersten Dinge, die ich überprüft habe :) – Sekhat

Antwort

3

Haben Sie einen Teil dieses Codes auf dem SlimDX WPF-Beispiel basieren? Es sieht so aus, als hättest du das, weshalb dein Clear() - Aufruf 0.0f für den Z-Clear-Wert verwendet ... was ein Fehler in unserem Beispiel ist. Es sollte 1.0f sein.

Darüber hinaus ist das einzige potenzielle Problem, das ich sehe, dass Ihre Oberfläche Renderziel eine andere Größe als Ihr Backbuffer ist, aber das sollte eigentlich keine Probleme verursachen. Haben Sie versucht, auf dem Backbuffer des Geräts (Device.GetBackBuffer()) anstelle einer neuen Oberfläche zu rendern, um zu sehen, welche Auswirkungen das hat?

+0

Sie waren in der Nähe. Also werde ich dich als richtig markieren. Meine Tiefen-/Schablonenpuffergröße war unterschiedlich zu meiner Renderzielgröße. Es hat nicht gefallen, sowohl die Tiefe als auch den Zielpuffer zu löschen, wenn beide unterschiedliche Größen hatten. Macht Sinn :) – Sekhat

2

Ändern Sie in Ihrem device.Clear-Aufruf das erste numerische Argument von 0f in 1f. Das ist die z-Tiefe, die von 0 bis 1 reicht. Die Angabe einer z-Tiefe von 0 tut effektiv nichts.

Verwandte Themen