深度模板不工作 - DirectX 10 C ++

时间:2012-10-29 19:54:35

标签: c++ directx depth stencil-buffer

我遇到了DirectX10 + C ++问题。

基本上我们处于渲染的早期阶段,由于某种原因,我们的深度模板似乎无法理解我们的模型。基本上,这是我们正在做的一切:

  1. 加载着色器,模型和纹理
  2. 初始化DirectX
  3. 绘制
  4. 模型,着色器和纹理都加载并正常工作(但是如下面的屏幕截图所示),深度模板显然没有完成其工作,并且着色器正在错误的位置使用。我还包括了我们的初始化方法,以防你需要它来解决它。我们相信我们已经尝试了几乎所有的东西,但是知道我们的运气,我们可能错过了一行重要代码^。^

    我们还看到其他人有同样的问题,但是他们的修复不起作用(他们的问题是他们已经将近剪裁平面设置为0.0,但是我们的不是0.0因此这不是问题)

    提前致谢!

    Problem screenshot

    void GraphicsDeviceDirectX::InitGraphicsDevice(HWND hWnd)
    {
        DXGI_SWAP_CHAIN_DESC scd;    // create a struct to hold various swap chain information
    
        ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC));    // clear out the struct for use
    
        scd.BufferCount = 2;    // create two buffers, one for the front, one for the back
        scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;    // use 32-bit color
        scd.BufferDesc.Height = 600;
        scd.BufferDesc.Width = 600;
        scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;    // tell how the chain is to be used
        scd.OutputWindow = hWnd;    // set the window to be used by Direct3D
        scd.SampleDesc.Count = 1;    // set the level of multi-sampling
        scd.SampleDesc.Quality = 0;    // set the quality of multi-sampling
        scd.Windowed = true;    // set to windowed or full-screen mode
    
        //set scan line ordering and scaling
        scd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
        scd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
    
        //discard back buffer dontents
        scd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
    
        //dont set advanced flags
        scd.Flags = 0;
    
        // create a device class and swap chain class using the information in the scd struct
        if(FAILED(D3D10CreateDeviceAndSwapChain(NULL,
                                      D3D10_DRIVER_TYPE_HARDWARE,
                                      NULL,
                                      D3D10_CREATE_DEVICE_DEBUG,
                                      D3D10_SDK_VERSION,
                                      &scd,
                                      &swapchain,
                                      &device)))
        {
            throw EngineException("Error creating graphics device");
        }
    
        //Push graphics device to Persistant Object Manager
        //PerObjMan::Push(device);
        //Push swapchain to Peristant Object Manager
        PerObjMan::Push(swapchain);
    
        // get the address of the back buffer and use it to create the render target
        ID3D10Texture2D* pBackBuffer;
        swapchain->GetBuffer(0, __uuidof(ID3D10Texture2D), (LPVOID*)&pBackBuffer);
        device->CreateRenderTargetView(pBackBuffer, NULL, &rtv);
    
        /*D3D10_TEXTURE2D_DESC descBack;
        pBackBuffer->GetDesc(&descBack);*/
        pBackBuffer->Release();
        pBackBuffer = NULL;
    
        //Push graphics device to Persistant Object Manager
        PerObjMan::Push(rtv);
    
        ID3D10Texture2D* pDepthStencil = NULL;
        D3D10_TEXTURE2D_DESC descDepth;
    
        ZeroMemory(&descDepth, sizeof(descDepth));
    
        descDepth.Width = 600;
        descDepth.Height = 600;
        descDepth.MipLevels = 1;
        descDepth.ArraySize = 1;
        descDepth.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
        descDepth.SampleDesc.Count = 1;
        descDepth.SampleDesc.Quality = 0;
        descDepth.Usage = D3D10_USAGE_DEFAULT;
        descDepth.BindFlags = D3D10_BIND_DEPTH_STENCIL;
        descDepth.CPUAccessFlags = 0;
        descDepth.MiscFlags = 0;
        HRESULT hr;
        hr = GetGraphicsDevice()->CreateTexture2D( &descDepth, NULL, &pDepthStencil );
        if(FAILED(hr))
            throw EngineException("FAIL");
    
        PerObjMan::Push(pDepthStencil);
    
        D3D10_DEPTH_STENCIL_DESC dsDesc;
    
        ZeroMemory(&dsDesc, sizeof(dsDesc));
        // Depth test parameters
        dsDesc.DepthEnable = true;
        dsDesc.DepthWriteMask = D3D10_DEPTH_WRITE_MASK::D3D10_DEPTH_WRITE_MASK_ALL;
        dsDesc.DepthFunc = D3D10_COMPARISON_FUNC::D3D10_COMPARISON_LESS;
    
        // Stencil test parameters
        dsDesc.StencilEnable = false;
        dsDesc.StencilReadMask = 0xFF;
        dsDesc.StencilWriteMask = 0xFF;
    
        // Stencil operations if pixel is front-facing.
        dsDesc.FrontFace.StencilFailOp = D3D10_STENCIL_OP_KEEP;
        dsDesc.FrontFace.StencilDepthFailOp = D3D10_STENCIL_OP_INCR;
        dsDesc.FrontFace.StencilPassOp = D3D10_STENCIL_OP_KEEP;
        dsDesc.FrontFace.StencilFunc = D3D10_COMPARISON_ALWAYS;
    
        // Stencil operations if pixel is back-facing.
        dsDesc.BackFace.StencilFailOp = D3D10_STENCIL_OP_KEEP;
        dsDesc.BackFace.StencilDepthFailOp = D3D10_STENCIL_OP_DECR;
        dsDesc.BackFace.StencilPassOp = D3D10_STENCIL_OP_KEEP;
        dsDesc.BackFace.StencilFunc = D3D10_COMPARISON_ALWAYS;      
    
        // Create depth stencil state
        hr = device->CreateDepthStencilState(&dsDesc, &dss);
        if(FAILED(hr))
            throw EngineException("FAIL");
    
        // Bind depth stencil state
        device->OMSetDepthStencilState(dss, 1);
    
    
        PerObjMan::Push(dss);
    
        D3D10_DEPTH_STENCIL_VIEW_DESC descDSV;
    
        ZeroMemory(&descDSV, sizeof(descDSV));
    
        descDSV.Format = descDepth.Format;
        descDSV.ViewDimension = D3D10_DSV_DIMENSION::D3D10_DSV_DIMENSION_TEXTURE2D;
        descDSV.Texture2D.MipSlice = 0;
    
        // Create the depth stencil view
        hr = device->CreateDepthStencilView( pDepthStencil, // Depth stencil texture
                                             &descDSV, // Depth stencil desc
                                             &dsv );  // [out] Depth stencil view
    
        if(FAILED(hr))
            throw EngineException("FAIL");
    
        PerObjMan::Push(dsv);
    
        // Bind the depth stencil view
        device->OMSetRenderTargets( 1,          // One rendertarget view
                                    &rtv,      // Render target view, created earlier
                                    dsv);     // Depth stencil view for the render target
    
    
        D3D10_VIEWPORT viewport;    // create a struct to hold the viewport data
    
        ZeroMemory(&viewport, sizeof(D3D10_VIEWPORT));    // clear out the struct for use
    
        GameToImplement::GameInfo::Info info = GameToImplement::GameInfo::GetGameInfo();
    
        RECT rect;
        int width = 0;
        int height = 0;
        if(GetClientRect(hWnd, &rect))
        {
            width = rect.right - rect.left;
            height = rect.bottom - rect.top;
        }
        else
        {
            throw EngineException("");
        }
    
        viewport.TopLeftX = 0;    // set the left to 0
        viewport.TopLeftY = 0;    // set the top to 0
        viewport.Width = 600;    // set the width to the window's width
        viewport.Height = 600;    // set the height to the window's height
        viewport.MinDepth = 0.0f;
        viewport.MaxDepth = 1.0f;
    
        device->RSSetViewports(1, &viewport);    // set the viewport
    
    }

1 个答案:

答案 0 :(得分:1)

我修好了,感谢catflier向正确的方向点头。事实证明,我实际上太早地发布了光栅化器状态,​​无法使用深度模板。

对于遇到同样问题的人,我会在这里留下这个答案。