Depth Buffer와 Stencil Buffer를 함께 사용
정규화된 깊이 정보를 저장하는 버퍼
Back Buffer의 Pixel마다 해당하는 z값 저장
기본적으로 Object의 z값이 작거나 같을 경우 갱신
자동적으로 Object를 Camera에 대하여 정렬한 효과
나중에 칠하는 Object가 가장 위에 나오게 하는 방식
백버퍼의 일부 영역을 차단하여 그려지지 않도록 하는 버퍼
거울, 그림자에서 사용 가능
HRESULT hr;
// 0번 resize 등록, 버퍼 정보 가져오기
D3D11_RENDER_TARGET_VIEW_DESC rtvd;
m_pRTV->GetDesc(&rtvd);
DXGI_SWAP_CHAIN_DESC scd;
m_pSwapChain->GetDesc(&scd);
// 1번 텍스처를 생성한다.
ComPtr<ID3D11Texture2D> pDSTexture;
D3D11_TEXTURE2D_DESC td;
ZeroMemory(&td, sizeof(td));
td.Width= scd.BufferDesc.Width;
td.Height= scd.BufferDesc.Height;
// DepthStencil Buffer에는 mipmap이 필요 없음
td.MipLevels=1;
td.ArraySize=1;
// Depth Buffer 24bit, Stencil Buffer 8bit
td.Format = DXGI_FORMAT_R24G8_TYPELESS;
// DepthStencil Buffer에는 1개의 버퍼 필요
td.SampleDesc.Count=1;
td.Usage = D3D11_USAGE_DEFAULT;
td.CPUAccessFlags=0;
td.MiscFlags=0;
td.BindFlags = D3D11_BIND_DEPTH_STENCIL;
hr = m_pd3dDevice->CreateTexture2D(&td, NULL, pDSTexture.GetAddressOf());
// 2번 깊이스텐실 뷰로 생성한다.
D3D11_DEPTH_STENCIL_VIEW_DESC dtvd;
ZeroMemory(&dtvd, sizeof(dtvd));
// Texture의 R24G8과는 다른 설정
dtvd.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
dtvd.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
hr=m_pd3dDevice->CreateDepthStencilView(pDSTexture.Get(), &dtvd, m_pDepthStencilView.GetAddressOf());
// 3번 뷰 등록, 3번째 인수
m_pImmediateContext->OMSetRenderTargets(1, m_pRTV.GetAddressOf(), m_pDepthStencilView.Get());
// 4번 상태 객체 생성
D3D11_DEPTH_STENCIL_DESC dsd;
ZeroMemory(&dsd, sizeof(dsd));
dsd.DepthEnable = TRUE;
dsd.DepthWriteMask= D3D11_DEPTH_WRITE_MASK_ALL;
dsd.DepthFunc= D3D11_COMPARISON_LESS_EQUAL;
/* BOOL StencilEnable;
UINT8 StencilReadMask;
UINT8 StencilWriteMask;
D3D11_DEPTH_STENCILOP_DESC FrontFace;
D3D11_DEPTH_STENCILOP_DESC BackFace;*/
hr=pd3dDevice->CreateDepthStencilState(&dsd, &g_pDefaultDepthStencil);
dsd.DepthFunc = D3D11_COMPARISON_GREATER;
hr = pd3dDevice->CreateDepthStencilState(&dsd, &g_pGreaterDepthStencil);
// 5번 깊이스텐실 뷰 상태 객체 적용
m_pImmediateContext->OMSetDepthStencilState(TDxState::g_pDefaultDepthStencil,
0xff);
// 6번 DepthStencilView 초기화(Frame)
// Depth와 Stencil은 따로 초기화 가능
m_pImmediateContext->ClearDepthStencilView(m_pDepthStencilView.Get(), D3D11_CLEAR_DEPTH| D3D11_CLEAR_STENCIL, 1.0f, 0);