디바이스 선택(Direct3D 9)

애플리케이션은 하드웨어를 쿼리하여 지원되는 Direct3D 디바이스 유형을 검색할 수 있습니다. 이 섹션에는 디스플레이 어댑터를 열거하고 Direct3D 디바이스를 선택하는 데 관련된 기본 작업에 대한 정보가 포함되어 있습니다.

애플리케이션은 적절한 Direct3D 디바이스를 선택하기 위해 일련의 작업을 수행해야 합니다. 다음 단계는 전체 화면 애플리케이션을 위한 것이며, 대부분의 경우 창이 있는 애플리케이션은 이러한 단계의 대부분을 건너뛸 수 있습니다.

  1. 처음에는 애플리케이션이 시스템의 디스플레이 어댑터를 열거해야 합니다. 어댑터는 하드웨어의 물리적 조각입니다. 그래픽 카드 이중 헤드 디스플레이의 경우와 마찬가지로 하나 이상의 어댑터를 포함할 수 있습니다. 다중 모니터 지원과 관련이 없는 애플리케이션은 이 단계를 무시하고 2단계의 IDirect3D9::EnumAdapterModes 메서드에 D3DADAPTER_DEFAULT 전달할 수 있습니다.

  2. 각 어댑터에 대해 애플리케이션은 IDirect3D9::EnumAdapterModes를 호출하여 지원되는 디스플레이 모드를 열거합니다.

  3. 필요한 경우 애플리케이션은 다음 코드 예제와 같이 IDirect3D9::CheckDeviceType을 호출하여 각 열거형 디스플레이 모드에서 하드웨어 가속이 있는지 확인합니다. 이는 IDirect3D9::CheckDeviceType에 사용할 수 있는 용도 중 하나일 뿐입니다. 자세한 내용은 하드웨어 지원 결정(Direct3D 9)을 참조하세요.

    D3DPRESENT_PARAMETERS Params;
    // Initialize values for D3DPRESENT_PARAMETERS members. 
    
    Params.BackBufferFormat = D3DFMT_X1R5G5B5; 
    
    if(FAILED(m_pD3D->CheckDeviceType(Device.m_uAdapter, 
                      Device.m_DevType, 
                      Params.BackBufferFormat, Params.BackBufferFormat, 
                      FALSE))) 
        return E_FAIL;
    
  4. 애플리케이션은 IDirect3D9::GetDeviceCaps 메서드를 호출하여 이 어댑터의 디바이스에 대해 원하는 수준의 기능을 확인합니다. 이 메서드에서 반환된 기능은 IDirect3D9::CheckDeviceType에서 확인된 모든 디스플레이 모드에서 디바이스에 대해 일정하게 유지됩니다.

  5. 디바이스는 항상 디바이스에서 지원하는 열거형 디스플레이 모드 형식의 표면에 렌더링할 수 있습니다. 애플리케이션이 다른 형식의 표면에 렌더링해야 하는 경우 IDirect3D9::CheckDeviceFormat을 호출할 수 있습니다. 디바이스가 형식으로 렌더링할 수 있는 경우 IDirect3D9::GetDeviceCaps 에서 반환된 모든 기능을 적용할 수 있습니다.

  6. 마지막으로, 애플리케이션은 IDirect3D9::CheckDeviceMultiSampleType 메서드를 사용하여 전체 장면 앤티앨리어싱과 같은 다중 샘플링 기술이 렌더링 형식에 지원되는지 여부를 확인할 수 있습니다.

이전 단계를 완료한 후 애플리케이션에는 작동할 수 있는 디스플레이 모드 목록이 있어야 합니다. 마지막 단계는 필요한 수의 버퍼 및 앤티앨리어싱을 수용하기 위해 충분한 디바이스 액세스 가능 메모리를 사용할 수 있는지 확인하는 것입니다. 이 테스트는 모드 및 다중 샘플 조합의 메모리 사용량을 확인하지 않고는 예측할 수 없으므로 필요합니다. 또한 일부 디스플레이 어댑터 아키텍처에는 디바이스 액세스 가능한 메모리의 일정한 양이 없을 수 있습니다. 즉, 애플리케이션이 전체 화면 모드로 전환할 때 비디오 메모리 부족 오류를 보고할 수 있어야 합니다. 일반적으로 애플리케이션은 사용자에게 제공하는 모드 목록에서 전체 화면 모드를 제거하거나, 백 버퍼 수를 줄이거나 덜 복잡한 다중 샘플링 기술을 사용하여 메모리 사용을 줄여야 합니다.

창이 있는 애플리케이션은 유사한 작업 집합을 수행합니다.

  1. 창의 클라이언트 영역에서 적용되는 바탕 화면 사각형을 결정합니다.
  2. 어댑터를 열거하여 모니터가 클라이언트 영역을 덮는 어댑터를 찾습니다. 클라이언트 영역이 둘 이상의 어댑터가 소유한 경우 애플리케이션은 각 어댑터를 독립적으로 구동하거나 단일 어댑터를 구동하도록 선택할 수 있으며 프레젠테이션 시 한 장치에서 다른 장치로 Direct3D 전송 픽셀을 사용할 수 있습니다. 애플리케이션은 위의 두 단계를 무시하고 D3DADAPTER_DEFAULT 어댑터를 사용할 수도 있습니다. 이로 인해 창이 보조 모니터에 배치될 때 작업이 느려질 수 있습니다.
  3. 애플리케이션은 IDirect3D9::CheckDeviceType 을 호출하여 디바이스가 데스크톱 모드에 있는 동안 지정된 형식의 백 버퍼로 렌더링을 지원할 수 있는지 확인해야 합니다. 다음 코드 예제와 같이 IDirect3D9::GetAdapterDisplayMode를 사용하여 데스크톱 디스플레이 형식을 확인할 수 있습니다.
    D3DPRESENT_PARAMETERS Params;
    // Initialize values for D3DPRESENT_PARAMETERS members. 
    
    // Use the current display mode.
    D3DDISPLAYMODE mode;
    
    if(FAILED(m_pD3D->GetAdapterDisplayMode(Device.m_uAdapter , &mode)))
        return E_FAIL;
    
    Params.BackBufferFormat = mode.Format;
    
    if(FAILED(m_pD3D->CheckDeviceType(Device.m_uAdapter, Device.m_DevType, 
    Params.BackBufferFormat, Params.BackBufferFormat, FALSE)))
        return E_FAIL;
    

Direct3D 디바이스