2011-01-12 20 views
5

He escrito un código con SlimDX y WPF donde espero que el resultado final sea una pantalla roja.SlimDX y WPF a través de D3DImage

Desafortunadamente, todo lo que obtengo es una pantalla negra.

Esto es en Windows 7.

Puede alguien ver algo importante que me falta?

La razón por la que estoy usando una superficie separada como el backbuffer para el D3DImage es que voy a necesitar múltiples ventanas gráficas. Pensé que renderizar en superficies separadas en lugar del dispositivo backbuffer inicial sería la mejor manera de lograr eso.

de todos modos, con el código ..

responsabilidad: Por favor, ignore el mal código, esto está escrito en su totalidad como código de usar y tirar para que yo pueda encontrar la manera de lo consigo lo que busco .

Aquí es mi clase de ventana:

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

Y aquí está mi clase "procesador"

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

- Editar: Por un segundo había pensado que había resuelto, pero es parece que solo funcionará cuando mi segundo objetivo de renderización (el que intento borrar en rojo) es 640x480. ¿Alguna idea?

+0

¿Ha comprobado que 'image.PixelWidth' y' image.PixelHeight' devuelven un valor distinto de cero - No puedo ver dónde está configurando el tamaño de 'D3DImage' (no lo creo) obtendrá el tamaño del back-buffer para usted, pero podría estar equivocado!) – Samuel

+0

De hecho lo obtiene de la superficie que asigné como backbuffer. Una de las primeras cosas que revisé :) – Sekhat

Respuesta

3

¿Basó algo de este código en la muestra SlimDX WPF? Parece que podrías tener, y es por eso que tu llamada a Clear() utiliza 0.0f para el valor de Z claro ... que es un error en nuestra muestra. Debería ser 1.0f.

Más allá de eso, el único problema potencial que veo es que su destino de renderizado de superficie es de un tamaño diferente que el de su búfer posterior, pero eso en realidad no debería causar problemas. ¿Has intentado renderizar en el backbuffer del dispositivo (Device.GetBackBuffer()) en lugar de una nueva superficie para ver qué impacto tiene?

+0

Estabas cerca. Así que te marcaré como correcto. Mi profundidad/tamaño del búfer de plantilla era diferente a mi tamaño objetivo de renderizado. No le gustaba borrar tanto la profundidad como el buffer objetivo cuando ambos eran de diferentes tamaños. Tiene sentido :) – Sekhat

2

En su dispositivo.Clave de llamada, cambie el primer argumento numérico de 0f a 1f. Esa es la profundidad z que va de 0 a 1. Especificar una profundidad z de 0 no hace nada.

Cuestiones relacionadas