2011-01-12 8 views
5

Napisałem trochę kodu używając SlimDX i WPF, gdzie oczekiwałbym, że końcowy wynik będzie czerwony ekran.SlimDX i WPF przez D3DImage

Niestety, wszystko, co dostaję, to czarny ekran.

to na windows 7.

Czy ktoś cokolwiek zobaczyć główną mi brakuje?

Powodem, dla którego używam oddzielnej powierzchni jako bufora wstecznego dla D3DImage jest to, że będę potrzebował wielu rzutni. Sądziłem, że najlepszym sposobem na osiągnięcie tego celu będzie renderowanie na osobne powierzchnie zamiast początkowego bufora urządzeń.

każdym razie, na z kodem ..

Zastrzeżenie: Proszę ignorować zły kod, to jest w całości napisany w kodzie jednorazowe tylko tak mogę dowiedzieć się, jak to zrobić osiągnąć to, co jestem po .

Oto moja klasa okno:

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

I herezje mój "renderer" class

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: Przez sekundę myślałem ja rozwiązać go, ale go Wygląda na to, że działa tylko wtedy, gdy mój drugi cel renderowania (ten, który próbuję usunąć z czerwonego) ma rozmiar 640 x 480. jakieś pomysły?

+0

Czy sprawdziłeś, czy 'image.PixelWidth' i' image.PixelHeight' zwracają wartość różną od zera - nie widzę gdzie ustawiasz rozmiar 'D3DImage' (nie sądzę, że to otrzyma rozmiar z back-bufora dla ciebie, ale może być nie tak!) – Samuel

+0

To robi, że dostaje to z powierzchni, którą przypiszę jako backbuffer. Jedna z pierwszych rzeczy, które sprawdziłem :) – Sekhat

Odpowiedz

3

Czy oparłeś trochę tego kodu na próbce WPD SlimDX? Wygląda na to, że możesz mieć, i dlatego twoje wywołanie Clear() używa 0.0f dla wartości Z clear ... która jest błędem w naszej próbce. Powinno to być 1.0f.

Poza tym jedynym możliwym problemem, jaki widzę, jest to, że docelowy obszar renderowania powierzchni ma inny rozmiar niż bufor wsteczny, ale to nie powinno powodować problemów. Czy próbowałeś renderować do backbuffera urządzenia (Device.GetBackBuffer()) zamiast nowej powierzchni, aby zobaczyć, jaki wpływ ma?

+0

Byłeś blisko. Więc oznaczę cię jako poprawną. Mój rozmiar bufora głębi/szablonu różni się od mojego rozmiaru docelowego renderowania. Nie podobało się czyszczenie zarówno głębokości, jak i bufora docelowego, gdy obie miały różne rozmiary. Ma sens :) – Sekhat

2

W twoim urządzeniu. Wywołaj połączenie, zmień pierwszy argument numeryczny z 0f na 1f. Jest to głębia Z, która mieści się w zakresie od 0 do 1. Określenie efektywnej głębokości Z równej zero nie działa.