Graphics 如何在Direct3D 11中启用深度测试?

Graphics 如何在Direct3D 11中启用深度测试?,graphics,3d,depth-buffer,direct3d11,Graphics,3d,Depth Buffer,Direct3d11,我正在试验Direct3D11API,我对D3D不是很熟悉。我的项目总是使用OpenGL。 到目前为止,我已经画出了一个简单的三角形。现在我想画一些更复杂的物体,但有一个问题。我不知道如何启用深度测试(或者它是否使用完全不同的概念?)。我得到的是这样的东西: DXGI_SWAP_CHAIN_DESC swapChainDesc; ZeroMemory(&swapChainDesc, sizeof(swapChainDesc)); swapChainDesc.BufferCount =

我正在试验Direct3D11API,我对D3D不是很熟悉。我的项目总是使用OpenGL。 到目前为止,我已经画出了一个简单的三角形。现在我想画一些更复杂的物体,但有一个问题。我不知道如何启用深度测试(或者它是否使用完全不同的概念?)。我得到的是这样的东西:

DXGI_SWAP_CHAIN_DESC swapChainDesc;
ZeroMemory(&swapChainDesc, sizeof(swapChainDesc));

swapChainDesc.BufferCount = 1;
swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.OutputWindow = hWnd;
swapChainDesc.SampleDesc.Count = 1;
swapChainDesc.Windowed = true;

HRESULT result = D3D11CreateDeviceAndSwapChain(
    NULL,
    D3D_DRIVER_TYPE::D3D_DRIVER_TYPE_HARDWARE,
    NULL,
    0,
    NULL,
    0,
    D3D11_SDK_VERSION,
    &swapChainDesc,
    &SwapChain,
    &Device,
    NULL,
    &DeviceContext);

if (result != S_OK)
    throw "Direct3D initialization error";

ID3D11Texture2D *backBufferTexture;
result = SwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID *)&backBufferTexture);

if (result != S_OK)
{
        [error handling here]
}

result = Device->CreateRenderTargetView(backBufferTexture, NULL, &BackBuffer);
backBufferTexture->Release();

if (result != S_OK)
{
        [error handling here]
}

DeviceContext->OMSetRenderTargets(1, &BackBuffer, NULL);

我喜欢这样:

DXGI_SWAP_CHAIN_DESC swapChainDesc;
ZeroMemory(&swapChainDesc, sizeof(swapChainDesc));

swapChainDesc.BufferCount = 1;
swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.OutputWindow = hWnd;
swapChainDesc.SampleDesc.Count = 1;
swapChainDesc.Windowed = true;

HRESULT result = D3D11CreateDeviceAndSwapChain(
    NULL,
    D3D_DRIVER_TYPE::D3D_DRIVER_TYPE_HARDWARE,
    NULL,
    0,
    NULL,
    0,
    D3D11_SDK_VERSION,
    &swapChainDesc,
    &SwapChain,
    &Device,
    NULL,
    &DeviceContext);

if (result != S_OK)
    throw "Direct3D initialization error";

ID3D11Texture2D *backBufferTexture;
result = SwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID *)&backBufferTexture);

if (result != S_OK)
{
        [error handling here]
}

result = Device->CreateRenderTargetView(backBufferTexture, NULL, &BackBuffer);
backBufferTexture->Release();

if (result != S_OK)
{
        [error handling here]
}

DeviceContext->OMSetRenderTargets(1, &BackBuffer, NULL);

之后是着色器加载、矩阵设置、顶点和索引缓冲区初始化。我打赌这里少了一些东西,但不知道是什么。

好的,我已经找到了丢失的东西。深度缓冲区需要显式创建。有趣的是,深度和模具缓冲区合并到一个缓冲区中

D3D11_TEXTURE2D_DESC depthTextureDesc;
ZeroMemory(&depthTextureDesc, sizeof(depthTextureDesc));
depthTextureDesc.Width = width;
depthTextureDesc.Height = height;
depthTextureDesc.MipLevels = 1;
depthTextureDesc.ArraySize = 1;
depthTextureDesc.SampleDesc.Count = 1;
depthTextureDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
depthTextureDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;

ID3D11Texture2D *DepthStencilTexture;
result = Device->CreateTexture2D(&depthTextureDesc, NULL, &DepthStencilTexture);

if (result != S_OK) [error handling code]

D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
ZeroMemory(&dsvDesc, sizeof(dsvDesc));
dsvDesc.Format = depthTextureDesc.Format;
dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DMS;

result = Device->CreateDepthStencilView(DepthStencilTexture, &dsvDesc, &DepthBuffer);
DepthStencilTexture->Release();

if (result != S_OK) [error handling code]

DeviceContext->OMSetRenderTargets(1, &BackBuffer, DepthBuffer);
当然,每一帧都需要清除该缓冲区

DeviceContext->ClearDepthStencilView(DepthBuffer, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);

你的问题比代码更模糊。粘贴你的代码。我发现了问题所在。深度缓冲区需要单独创建(但我现在不能发布完整答案)。它们实际上是一个缓冲区。