스왑 체인

스왑 체인은 백 버퍼 회전을 제어하여 그래픽 애니메이션의 기초를 형성합니다.

개요

Direct3D 12의 스왑 체인에 대한 프로그래밍 모델은 이전 버전의 D3D와 동일하지 않습니다. 예를 들어 D3D10 및 D3D11에 있는 자동 리소스 회전을 지원하는 프로그래밍 편의는 더 이상 지원되지 않습니다. 자동 리소스 회전을 통해 렌더링되는 실제 표면이 각 프레임을 변경하는 동안 앱이 동일한 API 개체를 렌더링할 수 있었습니다. Direct3D 12의 다른 기능이 CPU 오버헤드를 낮게 할 수 있도록 스왑 체인의 동작이 Direct3D 12로 변경됩니다. 자동 색 키 및 다중 샘플링은 지원되지 않지만 특히 스트레칭과 회전은 여전히 지원되지 않습니다.

버퍼 수명

앱은 백 버퍼를 참조하는 미리 생성된 설명자를 저장할 수 있습니다. 스왑 체인이 소유한 버퍼 세트가 스왑 체인 수명 동안 변경되지 않도록 하면 이 기능을 사용할 수 있습니다. IDXGISwapChain::GetBuffer에서 반환되는 버퍼 집합은 특정 API가 호출될 때까지 변경되지 않습니다.

GetBuffer에서 반환된 버퍼의 순서는 변경되지 않습니다.

IDXGISwapChain3::GetCurrentBackBufferIndex는 현재 백 버퍼의 인덱스를 앱에 반환합니다.

스왑 효과

지원되는 스왑 효과는 DXGI_SWAP_EFFECT_FLIP_SEQUENTIALDXGI_SWAP_EFFECT_FLIP_DISCARD 버퍼 수가 1보다 커야 합니다.

창 모드와 전체 화면 모드 간 전환

Direct3D 12는 FSE(전체 화면 전용 모드)를 지원하지 않습니다. 대신 게임이 화면에 표시되는 유일한 애플리케이션인 경우 OS는 FSO(전체 화면 최적화)라는 전략을 사용하여 성능 저하 없이 FSE와 유사한 효과를 달성합니다. FSO에 대한 자세한 내용은 전체 화면 최적화 최적화를 참조하세요.

Direct3D 12는 창 모드와 전체 화면 모드 간에 전환한 후 애플리케이션이 ResizeBuffers 를 호출해야 하는 제한을 유지합니다(D3D11 플립 모델 스왑 체인에는 동일한 제한이 있습니다).

IDXGISwapChain::SetFullscreenState 전환은 스왑 체인의 앱 표시 버퍼 세트를 변경하지 않습니다. ResizeBuffersResizeTarget 호출만 앱 표시 버퍼를 만들거나 삭제합니다. 그러나 Direct3D 12 IDXGISwapChain::SetFullscreenState 는 전체 화면 전용 모드로 전환되지 않으며 전체 화면 최적화를 허용하도록 해상도 및 새로 고침 속도를 변경하기만 하면 됩니다. 이러한 변경 내용은 이 메서드를 사용하지 않고 앱에서 수행할 수 있습니다.

또는 IDXGISwapChain::P resent 또는 IDXGISwapChain1::P resent 가 호출되면 표시할 백 버퍼가 D3D12_RESOURCE_STATE_PRESENT 상태여야 합니다. 그렇지 않으면 가 DXGI_ERROR_INVALID_CALL 실패합니다.

전체 화면 스왑 체인에는 스왑 체인의 최종 릴리스 전에 SetFullscreenState(FALSE, NULL)를 호출해야 하는 제한 사항이 계속 적용됩니다. SetFullscreenState(FALSE)는 Direct3D 12 디바이스에서 실행되는 스왑 체인에서 성공합니다.

현재 작업은 스왑 체인을 만들 때 제공되는 3D 큐에서 발생하며 앱은 여러 스왑 체인을 동시에 제공하고 명령 목록을 기록하고 실행할 수 있습니다.

그래픽의 마지막 부분(예: 프레임 후처리)이 컴퓨팅 큐에서 수행되거나 디바이스의 그래픽 큐를 포함하지 않는 경우 표시할 두 번째 3D 큐를 만드는 것이 도움이 될 수 있으며 프레젠테이션 대기 시간이 다음 프레임의 시작을 지연시키는 것을 방지할 수 있습니다.

예제

다음 예제 코드는 기본 렌더링 루프에 있습니다.

void Present()
{
    m_swapChain->Present(0, m_presentFlags);
    m_backBufferIndex = (m_backBufferIndex + 1) % m_backBufferCount;
}

스왑 체인 만들기

CreateSwapChainForHwnd, CreateSwapChainForCoreWindow 또는 CreateSwapChainForComposition 호출을 사용할 경우 pDevice 매개 변수에는 실제로 디바이스가 아닌 Direct3D 12의 직접 명령 큐에 대한 포인터가 필요합니다.

Windows 7에서 프레젠테이션

Windows 7에서 Direct3D 12를 대상으로 하는 경우 Direct3D 12에 필요한 DXGI 형식이 없으므로 D3D12On7에서 제공하는 ID3D12CommandQueueDownLevel (직접 명령 큐에서 쿼리)을 사용해야 합니다.

Windows 7 현재 메서드에 열려 있는 명령 목록을 제공하면 사용, 닫기 및 자동으로 디바이스에 제출됩니다. 앱에서 만들어야 하고, 커밋된 리소스여야 하고, 단일 샘플링이어야 하며, 다음 형식 중 하나여야 하는 백 버퍼를 제공해야 합니다.

  • DXGI_FORMAT_R16G16B16A16_FLOAT
  • DXGI_FORMAT_R10G10B10A2_UNORM
  • DXGI_FORMAT_R8G8B8A8_UNORM
  • DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
  • DXGI_FORMAT_B8G8R8X8_UNORM
  • DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM
  • DXGI_FORMAT_B8G8R8A8_UNORM
  • DXGI_FORMAT_B8G8R8A8_UNORM_SRGB