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?
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
Infatti, recupera dalla superficie che assegno come un backbuffer. Una delle prime cose che ho controllato :) – Sekhat