DirectX Graphics 프로그래밍 가이드 Direct3D 의 기초지식 장치 장치의 선택   [목차열람] [주소복사] [슬롯비우기]
장치의 선택
 
Microsoft DirectX 9.0

장치의 선택


애플리케이션은, 지원 되고 있는 Microsoft® Direct3D® 장치 타입을 하드웨어에 조회해 검출할 수 있다. 여기에서는, 디스플레이 어댑터의 열거와 Direct3D 장치의 선택에 관련되는 기본 태스크에 대해 설명한다.

애플리케이션은, 적절한 Direct3D 장치를 선택하기 위한 일련의 태스크를 실행할 필요가 있다. 이하의 스텝은, 풀 스크린 애플리케이션의 태스크이다. 많은 경우, 윈도우 애플리케이션에서는 이러한 스텝의 대부분을 생략 할 수 있다.

  1. 최초로, 애플리케이션은 시스템 위에의 디스플레이 어댑터를 열거할 필요가 있다. 어댑터는, 하드웨어의 물리적 부품이다. 듀얼 헤드 디스플레이의 경우와 같이, 그래픽 카드에 복수의 어댑터가 탑재되고 있는 경우도 있으므로 주의 해야 한다. 멀티 모니터 지원에 관련하지 않는 애플리케이션에서는, 이 스텝을 무시해, 스텝 2 로 IDirect3D9::EnumAdapterModes 메서드에 D3DADAPTER_DEFAULT 를 건네준다.
  2. 애플리케이션은, 어댑터 마다 IDirect3D9::EnumAdapterModes 를 호출해, 그 어댑터가 지원 하는 디스플레이 모드를 열거한다.
  3. 필요에 따라서,IDirect3D9::CheckDeviceType 를 호출해, 열거된 각 디스플레이 모드에 하드웨어 가속화가 존재할지 어떨지를 체크한다. 이것에 대해서는, 다음 코드에 나타낸다. 이것은 IDirect3D9::CheckDeviceType 로 사용할 수 있는 방법의 1 개에 지나지 않는다. 더 자세한 정보는, 「하드웨어 지원의 판정」을 참조할것.
    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::GetDeviceCaps 가 돌려주는 장치 능력은,IDirect3D9::CheckDeviceType 로 검증된 모든 디스플레이 모드에 대해, 장치 마다 일정하는 것이 보증되고 있다.
  5. 장치는 항상, 그 장치가 지원 하는 포맷으로서 열거한 디스플레이 모드의 포맷을 가지는 표면에 렌더링 한다. 다른 포맷의 표면에 렌더링 하는 경우는,IDirect3D9::CheckDeviceFormat 를 호출한다. 장치가 그 포맷에 렌더링 할 수 있는 경우는,IDirect3D9::GetDeviceCaps 가 돌려주는 모든 능력이 적용 가능하다라고 하는 것이 보증된다.
  6. 마지막으로,IDirect3D9::CheckDeviceMultiSampleType 메서드를 사용해, 렌더링 포맷으로 풀 신 anti-aliasing등의 멀티 샘플링 테크닉이 지원 되고 있는지를 판정할 수 있다.

위의 스텝을 완료 하면, 애플리케이션에서는, 처리할 수 있는 디스플레이 모드의 리스트가 완성한다. 마지막 스텝에서는, 장치가 액세스 가능한 메모리에, 필요한 수의 버퍼와 anti-aliasing를 확보할 수 있는 스페이스가 있을지 어떨지를 검증한다. 이 테스트를 필요로 하는 이유는, 모드와 멀티 샘플의 편성에 의해 소비되는 메모리량이, 실제로 검증하는 이외 방법에서는 예측 불가능하기 때문에이다. 게다가 디스플레이 어댑터의 아키텍처에 따라서는, 액세스 가능한 메모리가 장치에 충분히 준비되지 않은 것이 있다. 즉, 풀 스크린 모드로 처리할 때 비디오 메모리 장해가 발생했을 경우는, 애플리케이션이 리포트할 필요가 있다. 일반적으로는, 애플리케이션이 사용자에 제공하는 모드 리스트로부터 풀 스크린 모드를 삭제하는지, 또는 사용하는 백 버퍼의 수를 줄이거나 복잡함이 적은 멀티 샘플 테크닉을 사용해, 메모리 소비량의 삭감을 꾀한다.

윈도우 애플리케이션에서도 같은 일련의 태스크를 실행한다.

  1. 윈도우의 클라이언트 영역에 맞는 데스크탑 직사각형을 결정한다.
  2. 어댑터를 열거해, 클라이언트 영역에 맞는 모니터를 사용하는 어댑터를 찾는다. 클라이언트 영역이 복수의 어댑터에 의해 소유되고 있는 경우는, 각 어댑터를 개별적으로 구동하는 방법인가, 1 개의 어댑터를 구동해, 프레젠테이션시에는 Direct3D 에 의해 장치로부터 장치에 픽셀을 전송 하는 방법인지를 선택할 수 있다. 또 전술의 2 개의 스텝을 무시해, D3DADAPTER_DEFAULT 어댑터를 사용하는 방법도 있다. 이 방법에서는, 윈도우가 2차 모니터상에 배치되면 처리 속도가 늦어지는 경우가 있다.
  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;


© 2002 Microsoft Corporation. All rights reserved.
↑TOP