2014-06-21 45 views
-2

我正在嘗試Direct3D 11 API,我對D3D不是很熟悉。我一直對我的項目使用OpenGL。 到目前爲止,我設法繪製了一個簡單的三角形。現在我想繪製一些更復雜的對象,但有一個問題。我不知道如何啓用深度測試(或使用完全不同的概念?)。我得到的東西是這樣的:如何在Direct3D 11中啓用深度測試?

depth problem

我初始化D3D這樣的:

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); 

接着是着色器加載,矩陣設定,頂點和索引緩衝區的初始化。我敢打賭,這裏有些失蹤,但不知道是什麼。

+0

你的問題比代碼更鬆散。粘貼你的代碼。 – FunctionR

+0

我發現了什麼問題。深度緩衝區需要單獨創建(但我現在不能發佈完整答案)。 – pvc

回答

1

好吧,我已經發現了什麼是失蹤。深度緩衝區需要明確創建。有趣的是,深度和模板緩衝區合併到一個緩衝區中。

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);