2011-01-12 17 views
5

Tôi đã viết một số mã bằng cách sử dụng SlimDX và WPF, nơi tôi mong đợi kết quả cuối cùng là màn hình màu đỏ.SlimDX và WPF qua D3DImage

Thật không may là tất cả những gì tôi nhận được là một màn hình màu đen.

Đây là trên các cửa sổ 7.

Có ai nhìn thấy bất kỳ thứ gì tôi thiếu không?

Lý do tôi sử dụng một bề mặt riêng biệt làm bộ đệm sau cho D3DImage là tôi sẽ cần nhiều chế độ xem. Tôi nghĩ rằng rendering để tách riêng các bề mặt thay vì các thiết bị backbuffer ban đầu sẽ là cách tốt nhất để đạt được điều đó.

dù sao, trên với mã ..

Disclaimer: Xin vui lòng bỏ qua các mã xấu, điều này được viết hoàn toàn dưới dạng mã ném-đi chỉ để tôi có thể tìm ra cách để làm đạt được những gì tôi là sau khi .

Đây là lớp cửa sổ của tôi:

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); 
     } 
    } 
} 

Và heres tôi "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(); 
     } 
    } 
} 

- Chỉnh sửa: Trong một giây tôi đã nghĩ rằng tôi muốn giải quyết nó, nhưng nó có vẻ như nó sẽ chỉ hoạt động khi mục tiêu render thứ hai của tôi (cái tôi đang cố gắng xóa màu đỏ) là 640x480. Có suy nghĩ gì không?

+0

Bạn đã kiểm tra 'image.PixelWidth' và' image.PixelHeight' đang trả về giá trị khác không - tôi không thể thấy nơi bạn đang đặt kích thước của 'D3DImage' (tôi không nghĩ rằng nó sẽ nhận được kích thước từ bộ đệm phía sau cho bạn, nhưng có thể sai!) – Samuel

+0

Nó infact lấy nó từ bề mặt tôi gán như một backbuffer. Một trong những điều đầu tiên tôi đã kiểm tra :) – Sekhat

Trả lời

3

Bạn có căn cứ một số mã này trên mẫu WPD SlimDX không? Dường như bạn có thể có, đó là lý do tại sao cuộc gọi Clear() của bạn đang sử dụng 0.0f cho giá trị Z rõ ràng ... đó là một lỗi trong mẫu của chúng tôi. Nó phải là 1.0f.

Ngoài ra, vấn đề tiềm năng duy nhất tôi thấy là mục tiêu hiển thị bề mặt của bạn có kích thước khác với bộ đệm phía sau, nhưng điều đó không thực sự gây ra sự cố. Bạn đã thử kết xuất với backbuffer của thiết bị (Device.GetBackBuffer()) thay vì một bề mặt mới để xem tác động nào có?

+0

Bạn đã thân thiết. Vì vậy, tôi sẽ đánh dấu bạn là chính xác. Kích thước bộ đệm sâu/stencil của tôi khác với kích thước mục tiêu render của tôi. Nó không thích xóa cả chiều sâu và vùng đệm đích khi cả hai đều có kích thước khác nhau. Có ý nghĩa :) – Sekhat

2

Trong thiết bị của bạn.Xóa cuộc gọi, thay đổi đối số số đầu tiên từ 0f thành 1f. Đó là độ sâu z trong khoảng từ 0 đến 1. Chỉ định độ sâu z là 0 không có hiệu quả.