SlimDXとWPFを使ってコードを書いたところ、最終結果が赤い画面になることが予想されました。SlimDXとWPF via D3DImage
残念ながら私が得るのは黒い画面です。
これはWindows 7にあります。
誰も私が行方不明の何かを見ることができますか?
私がD3DImage
のバックバッファとして別のサーフェスを使用している理由は、複数のビューポートが必要になることです。私は、デバイスの初期バックバッファの代わりに別々のサーフェスにレンダリングすることが、これを達成する最良の方法だと考えました。とにかく
、コードを..に
免責事項:、不正なコードを無視し、これは完全に使い捨てのコードのように書かれているだけので、私は私が後だものを達成んする方法を見つけ出すことができますしてください。
ここに私のウィンドウクラスです:
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);
}
}
}
そしてHERESに私の "レンダラ" クラス
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();
}
}
}
- 編集:第二のために私はそれを解決したいと思っていたが、それ私の2番目のレンダリングターゲット(私が赤をクリアしようとしているもの)が640x480である場合にのみ動作するようです。何かご意見は?
'image.PixelWidth'と' image.PixelHeight'がゼロ以外の値を返していることを確認しましたか? 'D3DImage'のサイズをどこで設定しているのかわかりませんあなたのためにバックバッファからサイズを取得しますが、間違っている可能性があります!) – Samuel
それは私がバックバッファーとして割り当てるサーフェスからそれを得ることができます。私がチェックした最初のものの1つ。 – Sekhat