
Depth Stencil View는 원근감 있는 3차원 공간을 표현할 때 뒤에 있는 물체가 앞에 있는 물체를 가리지 않게 하기 위해 필요하다. 원리는 우리가 보는 화면이 3차원 공간을 찍고 있다고 하면 화면에서 광선을 쏴서 가장 먼저 부딪히는 거리를 값으로 저장한다. 최소 0에서 최대 1이고 값이 1이라면 그 자리에 아무것도 없다고 볼 수 있다.
Depth에 대해 알아봤는데 그렇다면 Stencil은 무엇일까? Stencil은 글자나 그림 모양을 오려내고 그 구멍에 물감을 넣어 그림을 찍어내는 기법인데, 깊이 정보 이외에 추가적인 정보를 설정해서 그 정보에 따라 작업을 할 수 있다.
void DepthStencilBuffer::Init(const WindowInfo& window, DXGI_FORMAT dsvFormat)
{
_dsvFormat = dsvFormat;
D3D12_HEAP_PROPERTIES heapProperty = CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT);
//Depth Stencil Flag 설정
D3D12_RESOURCE_DESC desc = CD3DX12_RESOURCE_DESC::Tex2D(_dsvFormat, window.width, window.height);
desc.Flags = D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL;
//초기값일 경우 더 빠른 계산 (최적화)
D3D12_CLEAR_VALUE optimizedClearValue = CD3DX12_CLEAR_VALUE(_dsvFormat, 1.0f, 0);
DEVICE->CreateCommittedResource(
&heapProperty,
D3D12_HEAP_FLAG_NONE,
&desc,
D3D12_RESOURCE_STATE_DEPTH_WRITE,
&optimizedClearValue,
IID_PPV_ARGS(&_dsvBuffer));
D3D12_DESCRIPTOR_HEAP_DESC heapDesc = {};
heapDesc.NumDescriptors = 1;
heapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
heapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_DSV;
DEVICE->CreateDescriptorHeap(&heapDesc, IID_PPV_ARGS(&_dsvHeap));
_dsvHandle = _dsvHeap->GetCPUDescriptorHandleForHeapStart();
DEVICE->CreateDepthStencilView(_dsvBuffer.Get(), nullptr, _dsvHandle);
}
기본적으로 ConstantBuffer과 코드 구성이 유사하지만, Depth Stencil 로 사용하겠다라고 Flag를 설정하는 것과 CommandQueue에서 Depth 초기값(1.0)을 설정하는데 초기값일 경우 더 빠른 계산을 위해 optimizedClearValue라는 값을 사용한다. 그리고 창의 크기가 바뀔 때마다 크기를 맞추기 위해 Depth Stencil Buffer을 Init해준다.
D3D12_CPU_DESCRIPTOR_HANDLE depthStencilView = GEngine->GetDepthStencilBuffer()->GetDSVCpuHandle();
_cmdList->OMSetRenderTargets(1, &backBufferView, FALSE, &depthStencilView);
//초기값 설정
_cmdList->ClearDepthStencilView(depthStencilView, D3D12_CLEAR_FLAG_DEPTH, 1.0f, 0, 0, nullptr);
CommandQueue에 RenderBegin에서 OMSetRenderTargets의 매개변수로 Depth Stencil View를 넣어주고 ClearDepthStencilView로 위에서 말한 초기값 설정을 한다. 이렇게 설정을 마치면 Depth 값에 따라서 출력을 하게 된다.
'그래픽스' 카테고리의 다른 글
| [DX12] Comoponent (0) | 2022.07.24 |
|---|---|
| [DX12] Material (0) | 2022.07.23 |
| [DX12] Texture Mapping (0) | 2022.07.23 |
| [DX12] Index Buffer (0) | 2022.07.22 |
| [DX12] Root Signature (0) | 2022.07.22 |