비타Cpp

Direct3D의 초기화 - 8. 깊이·스텐실 버퍼와 뷰 생성 본문

DirectX12/튜토리얼

Direct3D의 초기화 - 8. 깊이·스텐실 버퍼와 뷰 생성

멍C 2021. 10. 9. 13:41

깊이 버퍼는 그냥 가장 가까운 가시 물체들의 깊이 정보를(그리고 스텐실을 사용하는 경우에는 스텐실 정보도) 저장하는 2차원 텍스처이다. 텍스처는 GPU 자원의 하나이므로, 텍스처 자원을 서술하는 D3D12_RESOURCE_DESC 구조체를 채운 후 ID3D12Device::CreateCommittedResource를 호출하면 깊이·스텐실 버퍼를 생성할 수 있다. D3D12_RESOURCE_DESC구조체의 정의는 다음과 같다.

typedef struct D3D12_RESOURCE_DESC {
  D3D12_RESOURCE_DIMENSION Dimension;
  UINT64                   Alignment;
  UINT64                   Width;
  UINT                     Height;
  UINT16                   DepthOrArraySize;
  UINT16                   MipLevels;
  DXGI_FORMAT              Format;
  DXGI_SAMPLE_DESC         SampleDesc;
  D3D12_TEXTURE_LAYOUT     Layout;
  D3D12_RESOURCE_FLAGS     Flags;
} D3D12_RESOURCE_DESC;

https://docs.microsoft.com/en-us/windows/win32/api/d3d12/ns-d3d12-d3d12_resource_desc

 

D3D12_RESOURCE_DESC (d3d12.h) - Win32 apps

Describes a resource, such as a texture. This structure is used extensively.

docs.microsoft.com

GPU 자원들은 기본적으로 GPU 힙에 존재한다. GPU힙은 GPU 메모리의 블록인데, 특정한 속성들을 가지고 있다. ID3D12Device::CreateCommittedResource 메서드는 자원을 생성하고, 지정된 속성들에 부합하는 힙에 그 자원을 맡긴다.(Commit)

HRESULT ID3D12Device::CreateCommittedResource(
  const D3D12_HEAP_PROPERTIES *pHeapProperties,
  D3D12_HEAP_FLAGS            HeapFlags,
  const D3D12_RESOURCE_DESC   *pDesc,
  D3D12_RESOURCE_STATES       InitialResourceState,
  const D3D12_CLEAR_VALUE     *pOptimizedClearValue,
  REFIID                      riidResource,
  void                        **ppvResource
);

typedef struct D3D12_HEAP_PROPERTIES {
  D3D12_HEAP_TYPE         Type;
  D3D12_CPU_PAGE_PROPERTY CPUPageProperty;
  D3D12_MEMORY_POOL       MemoryPoolPreference;
  UINT                    CreationNodeMask;
  UINT                    VisibleNodeMask;
} D3D12_HEAP_PROPERTIES;

https://docs.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12device-createcommittedresource

 

ID3D12Device::CreateCommittedResource (d3d12.h) - Win32 apps

Creates both a resource and an implicit heap, such that the heap is big enough to contain the entire resource, and the resource is mapped to the heap.

docs.microsoft.com

 

https://docs.microsoft.com/en-us/windows/win32/api/d3d12/ns-d3d12-d3d12_heap_propertie

 

D3D12_HEAP_PROPERTIES (d3d12.h) - Win32 apps

Describes heap properties.

docs.microsoft.com


최적의 성능을 위해서는 자원들을 기본 힙에 넣어야 한다. 자료 올리기 힙이나 다시 읽기 힙은 해당 기능이 필요할 때에만 사용해야 한다.


깊이·스텐실 버퍼를 사용하기 전에 반드시 연관된 뷰를 생성해 파이프라인에 묶어야 한다. 구체적인 방법은 RTV뷰를 생성할 때와 비슷하다.

 

	//Depth/Stencil 버퍼와 뷰 생성
	D3D12_RESOURCE_DESC depthStencilDesc;
	depthStencilDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
	depthStencilDesc.Alignment = 0;
	depthStencilDesc.Width = mClientWidth;
	depthStencilDesc.Height = mClientHeight;
	depthStencilDesc.DepthOrArraySize = 1;
	depthStencilDesc.MipLevels = 1;

	depthStencilDesc.Format = DXGI_FORMAT::DXGI_FORMAT_R24G8_TYPELESS;

	depthStencilDesc.SampleDesc.Count = m4xMsaaState ? 4 : 1;
	depthStencilDesc.SampleDesc.Quality = m4xMsaaQuality ? (m4xMsaaQuality - 1) : 0;
	depthStencilDesc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
	depthStencilDesc.Flags = D3D12_RESOURCE_FLAGS::D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL;

	D3D12_CLEAR_VALUE optClear;
	optClear.Format = mDepthStencilFormat;
	optClear.DepthStencil.Depth = 1.0f;
	optClear.DepthStencil.Stencil = 0;
	ThrowIfFailed(md3dDevice->CreateCommittedResource(
		&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
		D3D12_HEAP_FLAG_NONE,
		&depthStencilDesc,
		D3D12_RESOURCE_STATE_COMMON,
		&optClear,
		IID_PPV_ARGS(mDepthStencilBuffer.GetAddressOf())));

	//리소스 fomat을 사용하여 전체 리소스의 mip 레벨0의 Desc생성
	D3D12_DEPTH_STENCIL_VIEW_DESC dsvDesc;
	dsvDesc.Flags = D3D12_DSV_FLAG_NONE;
	dsvDesc.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2D;
	dsvDesc.Format = mDepthStencilFormat;
	dsvDesc.Texture2D.MipSlice = 0;
	md3dDevice->CreateDepthStencilView(mDepthStencilBuffer.Get(), &dsvDesc, DepthStencilView());

	//깊이 버퍼로 사용할 리소스 초기화 상태로 변환
	mCommandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(mDepthStencilBuffer.Get(),
		D3D12_RESOURCE_STATE_COMMON, D3D12_RESOURCE_STATE_DEPTH_WRITE));

힙 속성 구조체를 생성할 때, 그 구조체의 확장 버전인 CD3DX12_HEAP_PROPERTIES의 생성자를 사용했다.

이 생성자의 구현은 다음과 같다.

explicit CD3DX12_HEAP_PROPERTIES(
	D3D12_HEAP_TYPE type, 
	UINT creationNodeMask = 1, 
	UINT nodeMask = 1)
    {
    		Type				= type;
  		CPUPageProperty			= D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
  		MemoryPoolPreference		= D3D12_MEMORY_POOL_UNKNOWN;
  		CreationNodeMask		= creationNodeMask;
  		VisibleNodeMask			= nodeMask;
    }

 

Comments