기능 요약(Windows Vista용 Direct3D 9)

이 설명서는 특히 DirectX 그래픽용 Windows Vista 확장을 참조합니다. Windows Vista용 DirectX의 성능을 개발하려면 Windows Vista SDK와 DirectX SDK를 설치해야 합니다. Windows Vista용 DirectX를 사용하는 애플리케이션은 XPDM(XP 드라이버 모델)과 달리 WDDM 드라이버(Windows 디바이스 드라이버 모델)를 사용하는 하드웨어를 사용해야 합니다. WDDM을 구현하지 않는 드라이버는 Windows Vista DirectX 그래픽 인터페이스를 인스턴스화할 수 없습니다.

다음 섹션 중 하나에서 Windows Vista의 새로운 DirectX 그래픽 기능을 살펴보세요.

디바이스 동작 변경

이제 디바이스는 두 가지 상황에서만 손실됩니다. 하드웨어가 중단되어 다시 설정되고 디바이스 드라이버가 중지된 경우. 하드웨어가 중단되면 ResetEx를 호출하여 디바이스를 다시 설정할 수 있습니다. 하드웨어가 중단되면 텍스처 메모리가 손실됩니다.

드라이버가 중지된 후 렌더링을 다시 시작하려면 IDirect9Ex 개체를 다시 만들어야 합니다.

창 모드의 다른 창에 의해 프레젠테이션 영역이 가려지거나 전체 화면 애플리케이션이 최소화되면 PresentEx 는 S_D3DPRESENTATIONOCCLUDED 반환합니다. 전체 화면 애플리케이션은 WM_ACTIVATEAPP 콜백 메시지를 받으면 렌더링을 다시 시작할 수 있습니다.

이전 버전의 DirectX에서 애플리케이션이 모드 변경을 경험했을 때 복구하는 유일한 방법은 디바이스를 다시 설정하여 모든 비디오 메모리 리소스 및 스왑 체인을 다시 만드는 것이었습니다. 이제 Windows Vista용 DirectX를 사용하면 모드 변경 후 다시 설정을 호출해도 텍스처 메모리 표면, 텍스처 및 상태 정보가 손실되지 않으며 이러한 리소스를 다시 만들 필요가 없습니다.

다중 스레드 소프트웨어 꼭짓점 처리 사용 안 됨

swvp(소프트웨어 꼭짓점 처리)를 위해 다중 스레딩을 사용하지 않도록 설정하는 새 대문자 비트(D3DCREATE_DISABLE_PSGP_THREADING)가 추가되었습니다. 이 매크로를 사용하여 IDirect3D9::CreateDevice에 대한 동작 플래그를 생성합니다.

#define D3DCREATE_DISABLE_PSGP_THREADING

1비트 표면

텍스트 문자 모양을 처리하는 데 특히 유용할 수 있는 새로운 1비트 표면 형식 형식이 있습니다. 새 형식을 D3DFMT_A1. 1비트 표면은 픽셀당 텍스처 또는 ComposeRects 또는 ColorFill에서 생성된 렌더링 대상 출력으로 사용하도록 설계되었습니다. 표면 너비와 높이에 대한 별도의 대문자는 없습니다. 구현은 2K 텍셀 x 8K 텍셀인 단일 크기의 표면을 지원해야 합니다.

1비트 표면은 텍셀당 1비트입니다. 따라서 픽셀의 모든 구성 요소(r,g,b,a)는 1이고 0은 모든 구성 요소가 0임을 의미합니다. ColorFill, UpdateSurface 및 UpdateTexture API와 함께 1비트 표면을 사용할 수 있습니다.

1비트 표면을 읽을 때 런타임은 지점 샘플 또는 나선형 필터링을 수행할 수 있습니다. 나선형 필터를 조정할 수 있습니다( SetConvolutionMonoKernel 참조).

1비트 표면에는 몇 가지 제한 사항이 있습니다.

  • Mip 매핑은 지원되지 않습니다.
  • sRGB 데이터는 1비트 표면에 읽거나 쓸 수 없습니다.
  • 1비트 표면은 꼭짓점 텍스처 또는 다중 샘플링에 사용할 수 없습니다.

깊이/스텐실 버퍼 읽기

IDirect3DDevice9::UpdateSurface를 사용하여 IDirect3DDevice9::CreateDepthStencilSurface 또는 IDirect3DDevice9::GetDepthStencilSurface에서 가져온 표면에서 깊이/스텐실 데이터를 읽거나 씁니다.

먼저 IDirect3DDevice9::CreateOffscreenPlainSurface를 사용하여 잠금 가능, 깊이만 또는 스텐실 전용 표면을 만듭니다. 다음 형식 중 하나를 사용합니다.

  • D3DFMT_D16_LOCKABLE
  • D3DFMT_D32F_LOCKABLE
  • D3DFMT_D32_LOCKABLE
  • D3DFMT_S8_LOCKABLE

둘째, 깊이/스텐실 버퍼와 새로 만든 잠금 가능한 깊이 또는 스텐실 표면 간에 데이터를 전송합니다. 전송은 IDirect3DDevice9::UpdateSurface를 사용하여 수행됩니다.

두 표면이 모두 LOCKABLE 형식이거나 둘 다 잠글 수 없는 경우 UpdateSurface가 실패합니다.

존재하지 않는 데이터를 전송하면 오류가 발생합니다(예: 잠글 수 없는 깊이 전용 표면에서 D3DFMT_S8_LOCKABLE 표면으로 전송).

IDirect3DDevice9::UpdateSurface에 대한 나머지 제한 사항은 여전히 적용됩니다.

리소스 공유

이제 Direct3D 리소스를 디바이스 또는 프로세스 간에 공유할 수 있습니다. 이는 텍스처, 꼭짓점 버퍼, 인덱스 버퍼 또는 표면(예: 렌더링 대상, 깊이 스텐실 버퍼 또는 오프스크린 일반 표면)을 포함한 모든 Direct3D 리소스에 적용됩니다. 공유하려면 생성 시 공유할 리소스를 지정하고 기본 풀(D3DPOOL_DEFAULT)에서 리소스를 찾아야 합니다. 공유를 위해 리소스를 만든 후에는 프로세스 내의 디바이스에서 공유하거나 프로세스 간에 공유할 수 있습니다.

공유 리소스를 사용하도록 설정하기 위해 리소스 만들기 API에는 추가 핸들 매개 변수가 있습니다. 공유 리소스를 가리키는 HANDLE입니다. 이전의 DirectX 수정 버전에서 이 인수는 API 서명의 일부였지만 사용되지 않았으며 NULL로 설정해야 합니다. Windows Vista부터 다음과 같은 방법으로 pSharedHandle을 사용합니다.

  • 포인터(pSharedHandle)를 NULL 로 설정하여 리소스를 공유하지 않습니다. 이는 Windows Vista 이전의 DirectX 동작과 같습니다.
  • 공유 리소스를 만들려면 초기화되지 않은 핸들(포인터 자체가 NULL(pSharedHandle != NULL)이 아니라 포인터가 NULL값(*pSharedHandle == NULL)을 가리키는 리소스 만들기 API(아래 참조)를 호출합니다. API는 공유 리소스를 생성하고 유효한 핸들을 반환합니다.
  • 비NULL 공유 리소스 핸들을 사용하여 이전에 만든 공유 리소스를 열고 액세스하려면 pSharedHandle을 해당 핸들의 주소로 설정합니다. 이러한 방식으로 이전에 만든 공유 리소스를 연 후에는 인터페이스가 해당 형식의 일반적인 리소스인 것처럼 Direct3D 9 또는 Direct3D 9Ex API에서 반환된 인터페이스를 사용할 수 있습니다.

리소스 만들기 API에는 CreateTexture, CreateVolumeTexture, CreateCubeTexture, CreateRenderTarget, CreateVertexBuffer, CreateIndexBuffer, CreateDepthStencilSurface, CreateOffscreenPlainSurface, CreateDepthStencilSurfaceEx, CreateOffscreenPlainSurfaceExCreateRenderTargetEx가 포함됩니다.

공유 리소스 사용에 대한 몇 가지 제한 사항이 있습니다. 여기에는 다음이 포함됩니다.

  • 공유 리소스를 여는 데 사용하는 API는 공유 리소스를 만드는 데 사용한 API와 일치해야 합니다. 예를 들어 CreateTexture 를 사용하여 공유 리소스를 만든 경우 CreateTexture 를 사용하여 공유 리소스를 열어야 합니다. CreateRenderTarget 을 사용하여 공유 리소스를 만든 경우 CreateRenderTarget 을 사용하여 공유 리소스를 열어야 합니다.
  • 공유 리소스를 열 때 D3DPOOL_DEFAULT 지정해야 합니다.
  • 잠금 가능한 리소스(D3DUSAGE_DYNAMIC, 꼭짓점 버퍼 및 instance 인덱스 버퍼가 있는 텍스처)는 공유 시 성능 저하를 경험할 수 있습니다. 잠금 가능한 rendertargets는 일부 하드웨어에서 공유되지 않습니다.
  • 프로세스 간 공유 리소스에 대한 참조는 원래 리소스와 동일한 차원을 가져야 합니다. 프로세스 간에 핸들을 전달할 때 참조를 동일하게 만들 수 있도록 차원 정보를 포함합니다.
  • 공유 프로세스 간 표면은 동기화 메커니즘을 제공하지 않습니다. 공유 표면에 대한 읽기/쓰기 변경은 예상되는 경우 참조 프로세스의 표면 보기를 반영하지 않을 수 있습니다. 동기화를 제공하려면 이벤트 쿼리를 사용하거나 텍스처를 잠급니다.
  • 처음에 공유 리소스를 만드는 프로세스만 잠글 수 있습니다(해당 공유 리소스에 대한 참조를 여는 모든 프로세스는 잠글 수 없음).
  • 공유 리소스가 잠겨 있으면 다른 프로세스에서 리소스를 사용할 수 있는지 확인할 수 있는 유효성 검사가 없습니다.

혼합하기 전에 sRGB 변환

이제 검사 프레임 버퍼 혼합 전에 디바이스가 파이프라인 데이터를 sRGB로 변환할 수 있는지 확인할 수 있습니다. 이는 디바이스가 sRGB에서 렌더링 대상 값을 변환한다는 것을 의미합니다. 하드웨어에서 변환이 지원되는지 확인하려면 이 한도에 대해 검사.

D3DPMISCCAPS_POSTBLENDSRGBCONVERT

이 상한은 혼합하기 전에 sRGB로의 변환을 지원하는 하드웨어를 식별합니다. 이 기능은 DWM(데스크톱 창 관리자)의 fp16 프레임 버퍼에서 고품질 렌더링에 중요합니다.

StretchRect 개선 사항

이전 버전의 DirectX에서 StretchRect에는 다양한 드라이버를 수용하기 위한 많은 제한이 있습니다(IDirect3DDevice9::StretchRect 참조). Windows Vista는 WDDM(Windows 디바이스 드라이버 모델)을 기반으로 합니다. 이 새로운 드라이버 모델은 훨씬 더 강력하며 드라이버가 하드웨어에서 특수한 사례를 처리할 수 있도록 합니다.

일반적으로 나머지 제한 사항은 렌더링 대상을 렌더링 대상 사용(D3DUSAGE_RENDERTARGET)으로 만들어야 한다는 것입니다. 이 제한은 간단한 복사본을 수행하는 경우 해제됩니다(원본 및 dest가 형식이 동일하고 크기가 동일하며 하위 사각형이 없는 경우).

시스템 메모리에서 텍스처 만들기

시스템 메모리의 사용, 할당 및 삭제에 대한 유연성이 더 필요한 애플리케이션은 이제 시스템 메모리 포인터에서 텍스처를 만들 수 있습니다. 예를 들어 애플리케이션은 GDI 시스템 메모리 비트맵 포인터에서 Direct3D 텍스처를 만들 수 있습니다.

이러한 텍스처를 만들려면 다음 두 가지 작업을 수행해야 합니다.

  • 텍스처 표면을 유지할 수 있는 충분한 시스템 메모리를 할당합니다. 최소 바이트 수는 픽셀당 너비 x 높이 x 바이트입니다.
  • HANDLE* 매개 변수의 시스템 메모리 화면에 포인터의 주소를 IDirect3DDevice9::CreateTexture에 전달합니다.

다음은 IDirect3DDevice9::CreateTexture에 대한 함수 프로토타입입니다.

STDMETHOD(CreateTexture)(THIS_ UINT Width, UINT Height, UINT Levels, 
    DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9** ppTexture, 
    HANDLE* pSharedHandle)

시스템 메모리 텍스처에는 다음과 같은 제한이 있습니다.

  • 텍스처 피치는 픽셀당 바이트 수의 텍스처 너비와 같아야 합니다.
  • 압축된 형식(DXT 형식)을 사용하는 경우 애플리케이션은 올바른 크기를 할당해야 합니다.
  • 단일 Mipmap 수준이 있는 텍스처만 지원됩니다.
  • Pool 인수에 대해 CreateTexture에 전달된 값은 D3DPOOL_SYSTEMMEM 합니다.
  • 이 API는 제공된 메모리를 텍스처로 래핑합니다. 완료될 때까지 이 메모리의 할당을 취소하지 마세요.