깊이 버퍼 지원 쿼리(Direct3D 9)

모든 기능과 마찬가지로 애플리케이션에서 사용하는 드라이버는 모든 유형의 깊이 버퍼링을 지원하지 않을 수 있습니다. 항상 드라이버의 기능을 검사. 대부분의 드라이버는 z 기반 깊이 버퍼링을 지원하지만 모든 드라이버가 w 기반 깊이 버퍼링을 지원하지는 않습니다. 지원되지 않는 체계를 사용하도록 설정하려고 하면 드라이버가 실패하지 않습니다. 대신 다른 깊이 버퍼링 메서드로 대체하거나 깊이 버퍼링을 모두 사용하지 않도록 설정하면 극단적인 깊이 정렬 아티팩트로 렌더링되는 장면이 발생할 수 있습니다.

Direct3D 디바이스를 만들기 전에 애플리케이션에서 사용할 디스플레이 디바이스에 대해 Direct3D를 쿼리하여 깊이 버퍼에 대한 일반적인 지원을 검사 수 있습니다. Direct3D 개체가 깊이 버퍼링을 지원한다고 보고하면 이 Direct3D 개체에서 만드는 모든 하드웨어 디바이스가 z 버퍼링을 지원합니다.

깊이 버퍼링 지원을 쿼리하려면 다음 코드 예제와 같이 IDirect3D9::CheckDeviceFormat 메서드를 사용할 수 있습니다.

// The following example assumes that pCaps is a valid pointer to an 
// initialized D3DCAPS9 structure
if(FAILED(m_pD3D->CheckDeviceFormat(pCaps->AdapterOrdinal, 
                                    pCaps->DeviceType, 
                                    AdapterFormat, 
                                    D3DUSAGE_DEPTHSTENCIL, 
                                    D3DRTYPE_SURFACE,
                                    D3DFMT_D16)))
    return E_FAIL;

IDirect3D9::CheckDeviceFormat 을 사용하면 해당 디바이스의 기능에 따라 만들 디바이스를 선택할 수 있습니다. 이 경우 16비트 깊이 버퍼를 지원하지 않는 디바이스는 거부됩니다.

다음 코드 예제에서는 IDirect3D9::CheckDepthStencilMatch 를 사용하여 렌더링 대상과의 깊이 스텐실 호환성을 확인합니다.

// Reject devices that cannot create a render target of RTFormat while
// the back buffer is of RTFormat and the depth-stencil buffer is
// at least 8 bits of stencil
if(FAILED(m_pD3D->CheckDepthStencilMatch(pCaps->AdapterOrdinal,
                                        pCaps->DeviceType, 
                                        AdapterFormat, 
                                        RTFormat, 
                                        D3DFMT_D24S8)))
    return E_FAIL;

드라이버가 깊이 버퍼를 지원한다는 것을 알고 있는 경우 w-buffer 지원을 확인할 수 있습니다. 깊이 버퍼는 모든 소프트웨어 래스터라이저에 대해 지원되지만 w 버퍼는 실제 애플리케이션에서 사용하기에 적합하지 않은 참조 래스터라이저에서만 지원됩니다. 애플리케이션에서 사용하는 디바이스 유형에 관계없이 w 기반 깊이 버퍼링을 사용하도록 설정하기 전에 w-buffers에 대한 지원을 확인합니다.

  1. 디바이스를 만든 후 IDirect3DDevice9::GetDeviceCaps 메서드를 호출하여 초기화된 D3DCAPS9 구조를 전달합니다.
  2. 호출 후 LineCaps 멤버에는 기본 형식 렌더링에 대한 드라이버 지원에 대한 정보가 포함됩니다.
  3. 이 구조체의 RasterCaps 멤버에 D3DPRASTERCAPS_WBUFFER 플래그가 포함된 경우 드라이버는 해당 기본 형식에 대한 w 기반 깊이 버퍼링을 지원합니다.

깊이 버퍼