Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过D3DImage的SlimDX和WPF_C#_Wpf_Slimdx - Fatal编程技术网

C# 通过D3DImage的SlimDX和WPF

C# 通过D3DImage的SlimDX和WPF,c#,wpf,slimdx,C#,Wpf,Slimdx,我已经使用SlimDX和WPF编写了一些代码,我希望最终结果是一个红屏 不幸的是,我得到的只是一个黑屏 这是在Windows7上 有人能看到我遗漏了什么吗 我之所以使用单独的曲面作为D3DImage的后缓冲层,是因为我需要多个视口。我认为渲染到分离的曲面而不是设备初始backbuffer将是实现这一点的最佳方法 不管怎样,继续写代码 免责声明:请忽略错误代码,这完全是作为一次性代码编写的,只是为了让我知道如何实现我想要的 这是我的窗口类: namespace SlimDXWithWpf {

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

不幸的是,我得到的只是一个黑屏

这是在Windows7上

有人能看到我遗漏了什么吗

我之所以使用单独的曲面作为
D3DImage
的后缓冲层,是因为我需要多个视口。我认为渲染到分离的曲面而不是设备初始backbuffer将是实现这一点的最佳方法

不管怎样,继续写代码

免责声明:请忽略错误代码,这完全是作为一次性代码编写的,只是为了让我知道如何实现我想要的

这是我的窗口类:

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

--编辑:有一秒钟我以为我已经解决了这个问题,但似乎只有当我的第二个渲染目标(我正试图清除红色的目标)是640x480时,它才会起作用。有什么想法吗?

在您的设备中。清除呼叫,将第一个数字参数从0f更改为1f。这是z深度,范围从0到1。将z深度指定为0实际上没有任何作用。

您是否将部分代码基于SlimDX WPF示例?看起来可能有,这就是为什么Clear()调用使用0.0f作为Z Clear值的原因。。。这是我们样本中的一个bug。它应该是1.0f


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

是否已检查
图像。PixelWidth
图像。PixelHeight
返回一个非零值-我看不到您在哪里设置
D3DImage
(我不认为它可以从后缓冲区中获取大小,但可能是错误的!)它实际上是从我指定为后缓冲区的曲面中获取的。我检查的第一件事是:)你很接近。所以我会把你标记为正确的。我的深度/模具缓冲区大小与渲染目标大小不同。它不喜欢在深度和目标缓冲区大小不同时同时清除它们。有道理:)
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();
        }
    }
}