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?
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
To robi, że dostaje to z powierzchni, którą przypiszę jako backbuffer. Jedna z pierwszych rzeczy, które sprawdziłem :) – Sekhat