我寫了一些使用SlimDX和WPF的代碼,我期望最終的結果是一個紅色的屏幕。SlimDX和WPF通過D3DImage
不幸的是,我得到的只是一個黑屏。
這是在Windows 7上。
任何人都可以看到我失蹤的任何主要內容嗎?
我使用單獨表面作爲D3DImage
的後緩衝器的原因是我將需要多個視口。我認爲渲染到單獨的表面而不是設備的初始backbuffer將是實現這一目標的最佳方式。
無論如何,在與代碼..
聲明:請忽略壞的代碼,這是完全寫成扔掉的代碼,這樣我可以計算出如何做到實現我後我。
這裏是我的窗口類:
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);
}
}
}
而且我的繼承人 「渲染」 類
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();
}
}
}
- 編輯:因爲我原以爲我會解決它,但它第二似乎它只會在我的第二個渲染目標(我試圖清除紅色的目標)爲640x480時才起作用。有什麼想法嗎?
你是否檢查過`image.PixelWidth`和`image.PixelHeight`返回一個非零值 - 我看不到你設置D3DImage的大小(我不認爲它將會從後臺緩衝區中爲你獲得大小,但可能是錯誤的!) – Samuel 2011-01-13 12:45:30
它實際上從我指定爲backbuffer的表面獲取它。我檢查的第一件事之一:) – Sekhat 2011-01-13 14:37:37