【问题标题】:SlimDX 11 Depth Buffer issuesSlimDX 11 深度缓冲区问题
【发布时间】:2011-06-23 20:46:34
【问题描述】:

我遇到了 SlimDX March SDK 的问题(我相信对于 DXSDK11 June 2010)。问题是,每当我将附加深度视图转到输出合并状态时,我都不会在屏幕上得到任何输出。我已经将我的代码与 DX11 样本进行了比较,它似乎是正确的。我已经为深度测试尝试了各种标志和格式(包括始终通过等),但似乎没有任何效果。如果有人能发现错误,我将不胜感激。这是代码。步骤如下:

  1. 初始化后台缓冲区:

            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);
    
  2. 然后初始化深度缓冲区:

            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);
    
  3. 设置渲染目标:

        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.SetTargets 中删除 DepthView,我就会开始在屏幕上看到图像(当然没有深度测试),反之亦然。

【问题讨论】:

  • 您是否查看过 DirectX 将为您提供的调试输出以查看是否列出了任何错误或警告?还可以尝试使用 PIX 来查看几何图形的确切情况。
  • 您初始化深度模板视图的方式与我完全相同。唯一不同的是我使用的格式是 Format.D24_UNorm_S8_UInt。你可以试试看它是否有效?编辑:哦,我根本没有使用 DepthStencilState。您可以尝试将其注释掉,看看是否是问题所在?

标签: c# slimdx directx-11


【解决方案1】:

原来,在 depthBufferDesc 中,我将宽度传递给 Height 变量,将高度传递给 Width。这会创建两个具有不同尺寸的渲染目标,从而将其分解。

【讨论】:

    猜你喜欢
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    相关资源
    最近更新 更多