因此,我一直使用C#SharpDX
包装程序DirectX
在Direct3D11
和Direct2D
中进行编程,以在程序中绘制到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返回一个RenderForm
,CoreLoop
是渲染循环,在该循环中我进行了Draw
调用和Present
。如何使用SwapChain1
代替SwapChain
?
我已经发布了适用于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));
}
}