如何在SharpDX中为2D渲染设置SwapChain1?

问题描述 投票:0回答:1

因此,我一直使用C#SharpDX包装程序DirectXDirect3D11Direct2D中进行编程,以在程序中绘制到RenderForm窗口。但是,SwapChain.Present信息指出我应该改用SwapChain1.Present1,并且我无法弄清楚如何更改代码以与SwapChain1一起使用。 CreateWithSwapChain甚至是Device中的Device1方法仅适用于普通的SwapChain,我不知道该如何简单地进行设置。

这些是正在使用的名称空间。

using SharpDX.Direct2D1;
using SharpDX.Direct3D;
using SharpDX.Direct3D11;
using SharpDX.DXGI;
using SharpDX.Windows;
using Device = SharpDX.Direct3D11.Device;
using Factory = SharpDX.Direct2D1.Factory;
using Resource = SharpDX.Direct3D11.Resource;

这是我用来设置RenderTarget的代码。

SwapChainDescription desc = new SwapChainDescription() {
                BufferCount = 1,
                ModeDescription = new ModeDescription(
               DXWindow.GetWindow().ClientSize.Width,
               DXWindow.GetWindow().ClientSize.Height,
               new Rational(60, 1),
               Format.R8G8B8A8_UNorm),
                IsWindowed = true,
                OutputHandle = DXWindow.GetWindow().Handle,
                SampleDescription = new SampleDescription(1, 0),
                SwapEffect = SwapEffect.Discard,
                Usage = Usage.RenderTargetOutput
            };
            Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.BgraSupport, new SharpDX.Direct3D.FeatureLevel[] { SharpDX.Direct3D.FeatureLevel.Level_10_0 }, desc, out Device device, out swapchain);
            Texture2D backbuffer = Resource.FromSwapChain<Texture2D>(swapchain, 0);
            RenderTargetView renderview = new RenderTargetView(device, backbuffer);
            renderView = new RenderTarget(new Factory(), backbuffer.QueryInterface<Surface>(), new RenderTargetProperties(new PixelFormat(Format.Unknown, SharpDX.Direct2D1.AlphaMode.Premultiplied)));
            RenderLoop.Run(DXWindow.GetWindow(), CoreLoop);

DXWindow.GetWindow() get返回一个RenderFormCoreLoop是渲染循环,在该循环中我进行了Draw调用和Present。如何使用SwapChain1代替SwapChain

c# directx sharpdx
1个回答
0
投票

我已经发布了适用于Swapchain2的代码。您可以在需要时将queryinterface与SwapChain1互换。我已经包含了Windows窗体和UWP初始化的代码。我不确定您在这里做什么。因此,尽管我在UWP上还没有做更多的工作,但是#define允许您进行交换,并且自从我上次接触它以来,它可能已被破坏。

//函数Create()

DXGI.Device1 dxgiDevice1_ = _d3dDevice.QueryInterface<DXGI.Device1>();
DXGI.Adapter dxgiAdapter_ = dxgiDevice1_.Adapter;
DXGI.Factory2 dxgiFactory2_ = dxgiAdapter_.GetParent<DXGI.Factory2>();

ReleaseAllDeviceContexts(true);

if (_swapChain != null)
{
    _swapChain.Dispose();
}

if (_swapChainBuffer != null)
{
    _swapChainBuffer.Dispose();
}

if (_parentSwapchain != null)
{
    _parentSwapchain.Dispose();
}

#if !WINDOWS_UWP
DXGI.SwapChainDescription1 swapChainDescription_ = new DXGI.SwapChainDescription1()
{
    AlphaMode = DXGI.AlphaMode.Ignore,
    Width = _modeDescription.Width,
    Height = _modeDescription.Height,
    Format = DXGI.Format.R8G8B8A8_UNorm,
    Scaling = DXGI.Scaling.None,
    BufferCount = _swapChainBufferCount,
    SwapEffect = SharpDX.DXGI.SwapEffect.FlipDiscard,

    Flags = SharpDX.DXGI.SwapChainFlags.AllowModeSwitch,
    Usage = DXGI.Usage.BackBuffer | DXGI.Usage.RenderTargetOutput,
    SampleDescription = new DXGI.SampleDescription() { Count = 1, Quality = 0 },
    Stereo = false,
};

_parentSwapchain1 = new DXGI.SwapChain1(dxgiFactory2_, _d3dDevice, _parentContainer.WindowHandle, ref swapChainDescription_, new DXGI.SwapChainFullScreenDescription()
{
    RefreshRate = _modeDescription.RefreshRate,
    Scaling = SharpDX.DXGI.DisplayModeScaling.Unspecified,
    Windowed = isFullscreen == false,
    ScanlineOrdering = DXGI.DisplayModeScanlineOrder.Unspecified,
}
);

_swapChain = _parentSwapchain.QueryInterface<DXGI.SwapChain2>();
#else
DXGI.SwapChainDescription1 swapChainDescription = new DXGI.SwapChainDescription1()
{
    AlphaMode = DXGI.AlphaMode.Ignore,
    Width = _modeDescription.Width,
    Height = _modeDescription.Height,
    Format = DXGI.Format.R8G8B8A8_UNorm,
    Scaling = DXGI.Scaling.Stretch,
    BufferCount = _swapChainBufferCount,
    SwapEffect = SharpDX.DXGI.SwapEffect.FlipDiscard,

    Flags = SharpDX.DXGI.SwapChainFlags.AllowModeSwitch | DXGI.SwapChainFlags.AllowTearing,


    Usage = DXGI.Usage.BackBuffer | DXGI.Usage.RenderTargetOutput,
    SampleDescription = new DXGI.SampleDescription() { Count = 1, Quality = 0 },
    Stereo = false,
};

ComObject obj = new ComObject(_parentContainer.WindowHandle);

 _parentSwapchain1 = new DXGI.SwapChain1(dxgiFactory3, _device, ref swapChainDescription, null);

_swapChain2 = _parentSwapchain1.QueryInterface<DXGI.SwapChain2>();

using (DXGI.ISwapChainPanelNative nativeObject = ComObject.As<DXGI.ISwapChainPanelNative>(_parentContainer.WindowHandle))
{
    // Set its swap chain.
    nativeObject.SwapChain = _swapChain2;
}
#endif

_swapChainBuffer = D3D11.Texture2D.FromSwapChain<D3D11.Texture2D>(_swapChain, 0);

dxgiDevice1_.Dispose();
dxgiAdapter_.Dispose();
dxgiFactory2_.Dispose();

缓冲区的大小也包括在这里以供参考。但是,忽略一些自定义代码,这些都是我的游戏内部代码,因此其中一些将毫无意义。

           public void ResizeBuffers(bool isFullscreen)
        {
            try
            {
                if (_swapChainBuffer != null)
                {
                    //      if (_parentSwapchain1.IsFullScreen != isFullscreen)
                    {
                        ReleaseAllDeviceContexts(true);

                        SharpDX.Utilities.Dispose(ref _swapChain2);
                        SharpDX.Utilities.Dispose(ref _swapChainBuffer);

#if !WINDOWS_UWP
                        _parentSwapchain1.IsFullScreen = isFullscreen;

                        _parentSwapchain1.ResizeBuffers(0, _modeDescription.Width, _modeDescription.Height, DXGI.Format.Unknown, SharpDX.DXGI.SwapChainFlags.AllowModeSwitch);
                        if (isFullscreen)
                        {
                            _parentSwapchain1.ResizeTarget(ref _modeDescription);
                        }
#else
                        _parentSwapchain1.ResizeBuffers(0, _modeDescription.Width, _modeDescription.Height, DXGI.Format.Unknown, DXGI.SwapChainFlags.AllowTearing);
#endif

                        _swapChain2 = _parentSwapchain1.QueryInterface<DXGI.SwapChain2>();

                        _swapChainBuffer = D3D11.Texture2D.FromSwapChain<D3D11.Texture2D>(_swapChain2, 0);
                    }
                    _renderViewport = new Viewport(0, 0, _modeDescription.Width, _modeDescription.Height);
                    _d3dDevice.ImmediateContext1.Rasterizer.SetViewport(_renderViewport);
                }

            }
            catch (Exception ex)
            {
                ErrorHandler.DoErrorHandling(ex, ErrorHandler.GetCurrentMethod(ex));
            }

        }
© www.soinside.com 2019 - 2024. All rights reserved.