[주의 사항] D3D12 학습 4.3.8 깊이 / 스텐실 버퍼 및보기 만들기를

우리는 지금 깊이 / 스텐실 버퍼를 작성해야합니다. §4.1.5 같이, 단순히 2D 텍스처 깊이 버퍼 (템플릿 (스텐실)를 사용하는 경우, 템플릿 정보도 저장) 최신 표시 객체의 깊이 정보를 저장한다. 텍스처는 GPU 자원이다, 그래서 우리는 자원의 질감을 작성하여 D3D12_RESOURCE_DESC의 구조를 설명하고 하나를 만들 수 ID3D12Device :: CreateCommittedResource 방법을 문의하십시오. 다음 D3D12_RESOURCE_DESC 구조 정의된다 :

타입 정의의 구조체 D3D12_RESOURCE_DESC { 
  D3D12_RESOURCE_DIMENSION 차원; 
  UINT64 정렬; 
  UINT64 폭; 
  UINT 높이; 
  UINT16 DepthOrArraySize; 
  UINT16 MipLevels; 
  DXGI_FORMAT 형식; 
  DXGI_SAMPLE_DESC SampleDesc; 
  D3D12_TEXTURE_LAYOUT 레이아웃; 
  D3D12_RESOURCE_MISC_FLAG MiscFlags; 
D3D12_RESOURCE_DESC};

1.Dimension : 자원의 크기는 다음과 같은 열거 형 중 하나입니다 :

  열거 D3D12_RESOURCE_DIMENSION
  {
    D3D12_RESOURCE_DIMENSION_UNKNOWN = 0
    D3D12_RESOURCE_DIMENSION_BUFFER = 1
    D3D12_RESOURCE_DIMENSION_TEXTURE1D = 2
    D3D12_RESOURCE_DIMENSION_TEXTURE2D = 3
    D3D12_RESOURCE_DIMENSION_TEXTURE3D = 4
  } D3D12_RESOURCE_DIMENSION;

2. 폭 : 텍셀 단위 텍스처의 폭. 버퍼의 바이트 수를 버퍼 리소스를 들어.

3.Height : 텍셀 단위 텍스처 높이입니다.

4.DepthOrArraySize : 텍스처 배열 크기 또는 질감 (1D 및 2D 질감) 질감 깊이. 당신이 텍스처 3D 텍스처의 배열을 가질 수 있습니다.

5.MipLevels : 밉맵 레벨의 수. 제 9 장 밉맵 관련 질감을 설명합니다. 깊이 / 스텐실 버퍼를 만들려면, 우리는 텍스처 밉맵 수준이 필요합니다.
형식 : 텍셀을 지정 DXGI_FORMAT 열거 형의 멤버의 형식입니다. §4.1.5에 도시 된 형식 중 하나 일 필요가 깊이 / 스텐실 버퍼 용.

6.SampleDesc : 멀티 샘플링 및 품질 레벨들의 개수; 참조 §4.1.7 및 §4.1.8. 리콜 깊이 버퍼의 화면 해상도와 깊이와 각 서브 픽셀의 색 / 템플릿 정보를 저장하기위한 버퍼보다 ​​큰 4 번을 사용하여 4X MSAA. 따라서, 깊이 / 스텐실 버퍼에 설정된 다수의 샘플은 대상 설정된 일치 렌더링하는 데 사용되어야한다.

7.Layout : 회원 텍스처 레이아웃을 지정하는 열거 형을 D3D12_TEXTURE_LAYOUT. 현재, 우리가 레이아웃에 대해 걱정할 필요가 없습니다, 당신은 D3D12_TEXTURE_LAYOUT_UNKNOWN를 지정할 수 있습니다

8.MiscFlags : 기타 자원 플래그. 깊이 / 스텐실 버퍼 자원의 경우, D3D12_RESOURCE_MISC_DEPTH_STENCIL를 지정합니다.

 

GPU 리소스가 스택에 존재하는 이러한 자원은 본질적으로 특정 성질을 갖는 GPU 메모리 블록이다. ID3D12Device :: CreateCommittedResource 방법은 우리가 생성되어 메모리 블록에 제출 자원의 속성을 지정합니다 :

HRESULT ID3D12Device :: CreateCommittedResource (
   CONST이 D3D12_HEAP_PROPERTIES * pHeapProperties, 
  D3D12_HEAP_MISC_FLAG HeapMiscFlags, 
  const를 D3D12_RESOURCE_DESC * pResourceDesc, 
  D3D12_RESOURCE_USAGE InitialResourceState, 
  const를 D3D12_CLEAR_VALUE * pOptimizedClearValue, 
  REFIID riidResource, 
  무효 ** ppvResource); 
 
타입 정의 구조체 D3D12_HEAP_PROPERTIES { 
 D3D12_HEAP_TYPE 유형; 
 D3D12_CPU_PAGE_PROPERTIES의 CPUPageProperties; 
 D3D12_MEMORY_POOL MemoryPoolPreference; 
 UINT CreationNodeMask; 
 UINT VisibleNodeMask; 
D3D12_HEAP_PROPERTIES};

1.pHeapProperties : 우리는 힙의 특성에 최선을 다하고 자원을합니다. 고급 사용에 대한 이러한 속성 중 일부. : 현재, 우리는 고려해야 할 주요 속성은 유형 열거 D3D12_HEAP_PROPERTIES 다음과 같은 멤버 중 하나가 될 수 있습니다, D3D12_HEAP_TYPE입니다
  D3D12_HEAP_TYPE_DEFAULT : 기본 힙. 우리가 제출 한 자료 만 단독으로 GPU에 의해 액세스되는 곳이다. 예를 들어 깊이 / 스텐실 버퍼, : GPU의 읽기와 쓰기 깊이 / 스텐실 버퍼. CPU가 액세스 할 필요가 없습니다, 그래서 깊이 / 스텐실 버퍼는 기본 힙에 배치됩니다 결코
  D3D12_HEAP_TYPE_UPLOAD : 업로드 힙. 우리는 GPU에 대한 CPU에서 데이터를 업로드해야하는 경우, 우리는 여기에 자원에 제출해야합니다;
  D3D12_HEAP_TYPE_READBACK : 리드 백 힙 (읽기 다시 힙). 우리가 필요로하는 자원이 CPU를 읽을 제출하는 경우에, 우리는 여기에 자원에 제출
  , 고급 시나리오의 사용에 대한 자세한 내용은 MSDN 문서를 참조하십시오 : D3D12_HEAP_TYPE_CUSTOM를.

사이드 노트 : 자원이 최적의 성능을 위해 기본 힙에 배치해야합니다. 만 업로드하거나 각각의 기능에 때 힙을 다시 읽을 수 있습니다.
2.HeapMiscFlags : 우리가 힙에 제출해야하는 리소스에 대한 다른 표지판입니다. 이것은 일반적으로 D3D12_HEAP_MISC_NONE입니다.
3.pResourceDesc : D3D12_RESOURCE_DESC 포인터 포인트는 우리가 만들려는 자원의 인스턴스를 설명합니다.
4.InitialResourceState : 검토 §4.2.3는 현재의 자원 사용이 있습니다. 당신은 자원의 초기 상태를 만들 때 리소스를 설정하려면이 매개 변수를 사용합니다. 깊이 / 스텐실 버퍼의 경우, 초기 상태는 우리가 파이프 라인에 결합하는 깊이 / 스텐실 버퍼로 사용할 수 있도록, D3D12_RESOURCE_USAGE_DEPTH로 변환하기를 원할 것입니다, D3D12_RESOURCE_USAGE_INITIAL 것입니다.
5.pOptimizedClearValue : D3D12_CLEAR_VALUE 포인터 개체, 개체가 최적화 기술 된 값은 자원을 지워집니다. 명확하고 호출의 값과 일치 삭제 호출의 최적화는 최적화 된 값이 명확 일치하지 않는 것보다 빠르게 삭제 될 수 있습니다. 이 값은 지정되지 간극 값을 최적화하기 위해서, 널 (null)을 지정할 수있다.

구조체 D3D12_CLEAR_VALUE 
{ 
    DXGI_FORMAT 형식; 
    연합 { 
      색상 플로트 [ 4 ]; 
      D3D12_DEPTH_STENCIL_VALUE DepthStencil; 
    }; 
D3D12_CLEAR_VALUE};

6.riidResource : 우리는 COM ID ID3D12Resource 인터페이스의 포인터를 얻을합니다.
7.ppvResource는 : ID3D12Resource는 ID3D12Resource는 새로 생성 된 자원을 나타내는, 포인터에 대한 포인터를 반환한다.

 

또한, 깊이 / 스텐실 버퍼를 사용하기 전에, 우리는 파이프 라인에 결합 할 수있는 관련된 깊이 / 스텐실 뷰를 작성해야합니다. 이 대상보기를 렌더링 만들 비슷합니다. 다음 코드 예제에서는 우리가 깊이 / 스텐실 질감 및 해당 깊이 / 스텐실 뷰를 생성하는 방법을 보여줍니다 :

// 깊이 / 스텐실 버퍼 및 뷰를 생성합니다. 
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 = mDepthStencilFormat; 
depthStencilDesc.SampleDesc.Count = m4xMsaaState를? 4 : 1; 
depthStencilDesc.SampleDesc.Quality = m4xMsaaState를? (m4xMsaaQuality - 1 ) 0 ; 
depthStencilDesc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN; 
depthStencilDesc.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 ()))); 
// 사용하여 전체 자원의 밉 레벨 0에 기술자 만들기
 //의 자원의 형식을. 
md3dDevice-> CreateDepthStencilView ( 
  mDepthStencilBuffer.Get () 
  nullptr, 
  DepthStencilView ()); 
 
// 초기 상태에서 전환 자원이 깊이 버퍼로서 사용한다. 
mCommandList-> ResourceBarrier (
   1 , 
  CD3DX12_RESOURCE_BARRIER : 전환 ( 
    mDepthStencilBuffer.Get ()  
    D3D12_RESOURCE_STATE_COMMON,
    D3D12_RESOURCE_STATE_DEPTH_WRITE));
우리는 힙 속성 구조, 생성 할 CD3DX12_HEAP_PROPERTIES 도우미 생성자를 사용하여 참고 한다 과 같이 구현을 :
 명시 적 CD3DX12_HEAP_PROPERTIES ( 
    D3D12_HEAP_TYPE 유형, 
    UINT creationNodeMask = 1 , 
    UINT nodeMask = 1 ) 
{ 
  유형 = 유형; 
  CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; 
  MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; 
  CreationNodeMask = creationNodeMask; 
  VisibleNodeMask= nodeMask; 
}

두 번째 매개 변수를 CreateDepthStencilView 것은 D3D12_DEPTH_STENCIL_VIEW_DESC를 가리키는 포인터이다. 또한, 데이터 구조는 자원 요소의 형식 (포맷)을 설명한다. 자원 (즉 자유롭지 형),이 파라미터 (깊이 / 스텐실 버퍼 만 밉맵 레벨을 생성 밉맵 레벨 뷰이 리소스 생성을 나타내는 널이 될 수 형식화 된 포맷을 이용하여 생성 된 경우 ) 사용 형식 리소스를 만들 수 있습니다. 우리는 깊이 / 스텐실 버퍼의 종류를 지정하기 때문에 (밉맵 9 장에서 설명), 우리는이 파라미터에 null 지정.

추천

출처www.cnblogs.com/heben/p/11324842.html