4

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

-- Edit: For a second I had thought I'd solved it, but it seems it will only work when my second render target (the one I'm trying to clear red) is 640x480. Any thoughts?

4

2 に答える 2

3

このコードの一部は、SlimDX WPF サンプルに基づいていますか? Clear() 呼び出しで Z クリア値に 0.0f が使用されているのはそのためです...これはサンプルのバグです。1.0f である必要があります。

それを超えて、唯一の潜在的な問題は、サーフェス レンダー ターゲットがバック バッファーとは異なるサイズであることですが、実際には問題を引き起こすことはありません。新しいサーフェスではなく、デバイスのバックバッファー (Device.GetBackBuffer()) にレンダリングして、その影響を確認しましたか?

于 2011-01-13T17:00:26.390 に答える
2

device.Clear 呼び出しで、最初の数値引数を 0f から 1f に変更します。これは、0 から 1 の範囲の z 深度です。z 深度を 0 に指定しても、実質的には何も起こりません。

于 2011-01-13T11:58:34.397 に答える