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?
¿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
De hecho lo obtiene de la superficie que asigné como backbuffer. Una de las primeras cosas que revisé :) – Sekhat