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?
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
Es tatsächlich von der Oberfläche bekomme ich als Backbuffer zuweisen. Eines der ersten Dinge, die ich überprüft habe :) – Sekhat