c# - SlimDX 和 WPF 通过 D3DImage

标签 c# wpf slimdx

我使用 SlimDX 和 WPF 编写了一些代码,我希望最终结果是红屏。

不幸的是,我得到的只是黑屏。

这是在 Windows 7 上。

任何人都可以看到我遗漏的任何重要内容吗?

我使用单独的表面作为 D3DImage 的后备缓冲区的原因是我将需要多个视口(viewport)。我认为渲染到单独的表面而不是设备初始后备缓冲区将是实现这一目标的最佳方式。

无论如何,继续代码......

Disclaimer: Please ignore the bad code, this is written entirely as throw-away code just so I can figure out how to do achieve what I'm after.

这是我的窗口类:

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 时才有效。有什么想法吗?

最佳答案

您是否以 SlimDX WPF 示例为基础编写了部分代码?看起来你可能有,这就是为什么你的 Clear() 调用使用 0.0f 作为 Z 清除值......这是我们示例中的一个错误。应该是 1.0f。

除此之外,我看到的唯一潜在问题是您的表面渲染目标与后台缓冲区的大小不同,但这实际上不会导致问题。您是否尝试过渲染到设备的后备缓冲区 (Device.GetBackBuffer()) 而不是新表面以查看这有什么影响?

关于c# - SlimDX 和 WPF 通过 D3DImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4674075/

相关文章:

C#,后台 worker

c# - 将套接字事件包装为异步

wpf - 资源字典的 Visual Studio xaml 编辑器

c# - WPF 包装面板中的 float 行为

directx - 多个渲染目标不保存数据

c# - 缓存模式键的正则表达式 isMatch

c# - 我已经编写了一个线程池,如何通知使用它的方法任务已经完成?

WPF MVVM TreeView : prevent selection of a parent node when clicking on the disabled node

c# - SlimDX 中的二维三角形

directx - SlimDX 在一段时间后停止加载大纹理