4

我有一个 DirectX10 + C++ 问题。

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

  1. 加载着色器、模型和纹理
  2. 初始化 DirectX

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

我们还看到其他人也有同样的问题,但他们的修复没有奏效(他们的问题是他们将近剪裁平面设置为 0.0,但我们的不是 0.0,所以这不是问题)

提前致谢!

问题截图

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

}
4

1 回答 1

1

我修好了它,多亏了 catflier 朝正确的方向点头。事实证明,我实际上太早地释放了光栅化器状态,​​以至于无法使用深度模板。

我会把这个答案留给有同样问题的人。

于 2012-10-31T10:50:32.233 回答