2011-01-12 14 views
5

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である場合にのみ動作するようです。何かご意見は?

+0

'image.PixelWidth'と' image.PixelHeight'がゼロ以外の値を返していることを確認しましたか? 'D3DImage'のサイズをどこで設定しているのかわかりませんあなたのためにバックバッファからサイズを取得しますが、間違っている可能性があります!) – Samuel

+0

それは私がバックバッファーとして割り当てるサーフェスからそれを得ることができます。私がチェックした最初のものの1つ。 – Sekhat

答えて

3

このコードの一部をSlimDX WPFサンプルに基づいて作成しましたか?あなたの持っているように見えます。そのため、Clear()呼び出しがZのクリア値に0.0fを使用しています...これはサンプルのバグです。それは1.0fでなければなりません。

これ以外にも、あなたのサーフェスレンダリングターゲットはバックバッファとは異なるサイズですが、実際には問題は発生しません。新しいサーフェスの代わりにデバイスのバックバッファ(Device.GetBackBuffer())にレンダリングしてみましたか?

+0

あなたは近くにいた。だから私は正しいとあなたをマークします。私の深さ/ステンシルバッファーのサイズは、私のレンダーターゲットサイズとは異なりました。両方が異なるサイズであった場合、深さとターゲットバッファの両方をクリアするのは好きではありませんでした。覚えている:) – Sekhat

2

device.Clear呼び出しで、最初の数値引数を0fから1fに変更します。それは0から1の範囲のz深度です。0のz深度を指定すると効果的に何もしません。