SlimDX и WPF через D3DImage - PullRequest
       13

SlimDX и WPF через D3DImage

5 голосов
/ 13 января 2011

Я написал некоторый код с использованием SlimDX и WPF, где я ожидал, что конечный результат будет красным экраном.

К сожалению, все, что я получаю, это черный экран.

Это на 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);
        }
    }
}

И вот мой класс "рендерер"

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. Есть мысли?

Ответы [ 2 ]

3 голосов
/ 13 января 2011

Вы основывали часть этого кода на образце SlimDX WPF?Похоже, что у вас есть, поэтому ваш вызов Clear () использует 0.0f для значения Z clear ... что является ошибкой в ​​нашем примере.Это должно быть 1.0f.

Кроме того, единственная потенциальная проблема, которую я вижу, состоит в том, что ваша цель рендеринга поверхности имеет другой размер, чем ваш задний буфер, но это не должно вызывать проблем.Вы пытались выполнить рендеринг в буфер устройства (Device.GetBackBuffer ()) вместо новой поверхности, чтобы увидеть, какое влияние это оказывает?

2 голосов
/ 13 января 2011

В вашем вызове device.Clear измените первый числовой аргумент с 0f на 1f.Это глубина z в диапазоне от 0 до 1. Задание глубины z, равной 0, фактически ничего не делает.

...