SlimDX 11深度缓冲区问题

问题描述

| 我在SlimDX March SDK中遇到问题(我相信对于DXSDK11 June 2010)。问题在于,每当我将深度视图附加到输出合并状态时,屏幕上都不会得到任何输出。我已经将我的代码与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,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,ContextSettings.Width,ContextSettings.Height,0.0f,1.0f));

    Clear();
一旦我从OutputMerger.SetTargets中删除DepthView,我就开始在屏幕上看到图像(当然没有进行深度测试),反之亦然。     

解决方法

        事实证明,在depthBufferDesc中,我将width传递给Height变量,将height传递给Width。这是在创建两个具有不同尺寸的渲染目标,并将其分解。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...