카메라 좌표계 -> 투영 좌표계
2D화면을 보고 거리를 알 수 없다. 그러나 비율은 유지된다.
따라서 투영좌표계는 직사각형으로 되어있다.(비율만 따지겠다!)
중간에 있건 뒤에 있건 상관없이 비율의 결과물만 최종 결과물이 된다.
비율도 중요하지만 깊이 또한 중요하다
카메라가 가장 멀리 볼 수 있는 거리: 1, 카메라가 볼 수 있는 가장 가까운 거리: 0
각 물체의 깊이 값을 보고 물체를 그릴 지 안그릴 지 선택한다.
DX 기준으로 중앙: (0,0) 오른쪽+1, 위쪽+1, 왼쪽-1, 아래쪽-1
깊이 값을 이용하여 누가 더 앞에 나오는 물체인지 알 수 있다.
깊이 좌표는 0~1사이 값인데 그 범위를 벗어나면 계산을 하지 않는다.
깊이 버퍼를 통해 가장 카메라가 볼 수 있는 범위 내에 가장 카메라와 가까운 물체를 픽셀단위로 계산하여 그려준다.
depth stencil view: stencil값을 주어 어느 물체가 더 카메라와 가까이 있는지, 어떤 물체를 묘사해야 하는지 구분할 수 있다.
_dsvFormat = dsvFormat;
D3D12_HEAP_PROPERTIES heapProperty = CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT);
D3D12_RESOURCE_DESC desc = CD3DX12_RESOURCE_DESC::Tex2D(_dsvFormat, window.width, window.height);
desc.Flags = D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL; //depthStencil용도로 쓰겠다.
D3D12_CLEAR_VALUE optimizedClearValue = CD3DX12_CLEAR_VALUE(_dsvFormat, 1.0f, 0); // 1.0f으로 밀어줌
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);
---------------------------------------------------------
_pipelineDesc.DSVFormat = GEngine->GetDepthStencilBuffer()->GetDSVFormat();