SlimDX 11深度缓冲区问题
本文关键字:问题 缓冲区 深度 SlimDX | 更新日期: 2023-09-27 18:00:05
我遇到了SlimDX March SDK的问题(对于DXSDK11,我相信是2010年6月)。问题是,每当我将附加深度视图转到输出合并状态时,屏幕上都不会有任何输出。我已经将我的代码与DX11示例进行了比较,它似乎是正确的。我已经尝试了深度测试的各种标志和格式(包括始终通过等),但似乎都不起作用。如果有人能发现错误,我将不胜感激。这是代码。以下是步骤:
-
初始化后台缓冲区:
D3DDevice device; SwapChain swapChain; /// Create the swap chain SwapChainDescription desc = new SwapChainDescription() { BufferCount = 1, ModeDescription = new ModeDescription { Width = ContextSettings.Width, Height = ContextSettings.Height, RefreshRate = new SlimDX.Rational(ContextSettings.RefreshRate, 1), Format = ContextSettings.BufferFormat, }, IsWindowed = !ContextSettings.FullScreen, OutputHandle = WindowHandle, SampleDescription = new SampleDescription(1, 0), SwapEffect = SwapEffect.Discard, Usage = Usage.RenderTargetOutput, }; FeatureLevel[] featureLevels = new FeatureLevel[] { FeatureLevel.Level_11_0, FeatureLevel.Level_10_1 }; DriverType driverType = DriverType.Hardware; D3DDevice.CreateWithSwapChain(driverType, DeviceCreationFlags.Debug, featureLevels, desc, out device, out swapChain); Device = device; SwapChain = swapChain; /// Setup window association Factory factory = swapChain.GetParent<Factory>(); factory.SetWindowAssociation(WindowHandle, WindowAssociationFlags.IgnoreAll); /// Setup back buffers and render target views RenderBuffer = DXTexture2D.FromSwapChain<DXTexture2D>(swapChain, 0); RenderView = new RenderTargetView(Device, RenderBuffer);
-
然后初始化深度缓冲区:
Format depthFormat = Format.D32_Float; Texture2DDescription depthBufferDesc = new Texture2DDescription { ArraySize = 1, BindFlags = BindFlags.DepthStencil, CpuAccessFlags = CpuAccessFlags.None, Format = depthFormat, Height = width, Width = height, MipLevels = 1, OptionFlags = ResourceOptionFlags.None, SampleDescription = new SampleDescription( 1, 0 ), Usage = ResourceUsage.Default }; DepthBuffer = new DXTexture2D(Device, depthBufferDesc); DepthStencilViewDescription dsViewDesc = new DepthStencilViewDescription { ArraySize = 0, Format = depthFormat, Dimension = DepthStencilViewDimension.Texture2D, MipSlice = 0, Flags = 0, FirstArraySlice = 0 }; DepthView = new DepthStencilView(Device, DepthBuffer, dsViewDesc); DepthStencilStateDescription dsStateDesc = new DepthStencilStateDescription() { IsDepthEnabled = true, IsStencilEnabled = false, DepthWriteMask = DepthWriteMask.All, DepthComparison = Comparison.Less, }; DepthState = DepthStencilState.FromDescription(Device, dsStateDesc);
-
设置渲染目标:
DeviceContext.OutputMerger.DepthStencilState = DepthState; DeviceContext.OutputMerger.SetTargets(DepthView, RenderView); DeviceContext.Rasterizer.SetViewports(new Viewport(0, 0, ContextSettings.Width, ContextSettings.Height, 0.0f, 1.0f)); Clear();
一旦我从OutputMerger中删除DepthView。SetTargets我开始在屏幕上看到图像(当然没有深度测试),反之亦然。
事实证明,在depthBufferDesc中,我将width传递给Height变量,将Height传递给width。这是创建了两个具有不同维度的渲染目标,从而将其分解。