DirectX 11 API에 DirectX 9 기능 매핑
Direct3D 9 게임에서 사용하는 기능이 Direct3D 11 및 UWP(유니버설 Windows 플랫폼)로 변환되는 방식을 이해합니다.
또한 DirectX 포트 계획 및 Direct3D 9에서 Direct3D 11로 중요한 변경 내용을 참조하세요.
Direct3D 9를 DirectX 11 API에 매핑
Direct3D는 여전히 DirectX 그래픽의 기초이지만 DirectX 9 이후 API가 변경되었습니다.
- Microsoft DXGI(DirectX Graphics Infrastructure)는 그래픽 어댑터를 설정하는 데 사용됩니다. DXGI를 사용하여 버퍼 형식을 선택하고, 스왑 체인을 만들고, 프레임을 표시하고, 공유 리소스를 만듭니다. DXGI 개요를 참조하세요.
- Direct3D 디바이스 컨텍스트는 파이프라인 상태를 설정하고 렌더링 명령을 생성하는 데 사용됩니다. 대부분의 샘플은 즉각적인 컨텍스트를 사용하여 디바이스에 직접 렌더링합니다. 또한 Direct3D 11은 다중 스레드 렌더링을 지원하며, 이 경우 지연된 컨텍스트가 사용됩니다. Direct3D 11의 디바이스 소개를 참조하세요.
- 일부 기능은 더 이상 사용되지 않으며, 특히 고정 함수 파이프라인입니다. 사용되지 않는 기능을 참조하세요.
Direct3D 11 기능의 전체 목록은 Direct3D 11 기능 및 Direct3D 11 기능을 참조하세요.
Direct2D 9에서 Direct2D 11로 이동
Direct2D(Windows)는 여전히 DirectX 그래픽 및 Windows의 중요한 부분입니다. Direct2D를 사용하여 2D 게임을 그리고 Direct3D 위에 오버레이(HUD)를 그릴 수 있습니다.
Direct2D는 Direct3D를 기반으로 실행됩니다. 2D 게임은 API를 사용하여 구현할 수 있습니다. 예를 들어 Direct3D를 사용하여 구현된 2D 게임은 직교 프로젝션을 사용하고, Z 값을 설정하여 기본 형식의 그리기 순서를 제어하고, 픽셀 셰이더를 사용하여 특수 효과를 추가할 수 있습니다.
Direct2D는 Direct3D를 기반으로 하므로 DXGI 및 디바이스 컨텍스트도 사용합니다. Direct2D API 개요를 참조하세요.
DirectWrite API는 Direct2D를 사용하여 서식이 지정된 텍스트에 대한 지원을 추가합니다. DirectWrite 소개를 참조하세요.
사용되지 않는 도우미 라이브러리 바꾸기
D3DX 및 DXUT는 더 이상 사용되지 않으며 UWP 게임에서 사용할 수 없습니다. 이러한 도우미 라이브러리는 텍스처 로드 및 메시 로드와 같은 작업에 대한 리소스를 제공했습니다.
- Direct3D 9에서 UWP로의 단순 포트 연습에서는 창을 설정하고, Direct3D를 초기화하고, 기본 3D 렌더링을 수행하는 방법을 보여 줍니다.
- DirectX로 간단한 UWP 게임은 그래픽, 파일 로드, UI, 컨트롤 및 사운드를 비롯한 일반적인 게임 프로그래밍 작업을 보여 줍니다.
- DirectX 도구 키트 커뮤니티 프로젝트는 Direct3D 11 및 UWP 앱에서 사용할 도우미 클래스를 제공합니다.
셰이더 프로그램을 FX에서 HLSL로 이동
효과를 포함한 D3DX 유틸리티 라이브러리(D3DX 9, D3DX 10 및 D3DX 11)는 UWP에서 더 이상 사용되지 않습니다. UWP용 모든 DirectX 게임은 효과 없이 HLSL을 사용하여 그래픽 파이프라인을 구동합니다.
Visual Studio는 여전히 내부적으로 FXC를 사용하여 셰이더 개체를 컴파일합니다. UWP 게임 셰이더는 미리 컴파일됩니다. 바이트 코드는 런타임에 로드된 다음 각 셰이더 리소스가 적절한 렌더링 패스 중에 그래픽 파이프라인에 바인딩됩니다. 셰이더는 별도의 셰이더로 이동해야 합니다. HLSL 파일 및 렌더링 기술은 C++ 코드에서 구현해야 합니다.
셰이더 리소스 로드에 대한 자세한 내용은 Direct3D 9에서 UWP로의 단순 포트를 참조하세요.
Direct3D 11에는 Direct3D 기능 수준 11_0 이상이 필요한 셰이더 모델 5가 도입되었습니다. Direct3D 12용 HLSL 셰이더 모델 5 기능을 참조하세요.
XNAMath 및 D3DXMath 교체
XNAMath(또는 D3DXMath)를 사용하는 코드를 DirectXMath로 마이그레이션해야 합니다. DirectXMath에는 x86, x64 및 Arm에서 이식 가능한 형식이 포함됩니다. XNA 수학 라이브러리에서 코드 마이그레이션을 참조하세요.
DirectXMath float 형식은 셰이더와 함께 사용하기에 편리합니다. 예를 들어 XMFLOAT4 및 XMFLOAT4X4 상수 버퍼에 대한 데이터를 편리하게 정렬합니다.
DirectSound를 XAudio2(및 백그라운드 오디오)로 바꿉니다.
DirectSound는 UWP에 대해 지원되지 않습니다.
- XAudio2를 사용하여 게임에 사운드 효과를 추가합니다.
DirectInput을 XInput 및 Windows 런타임 API로 바꾸기
DirectInput은 UWP에 대해 지원되지 않습니다.
- 마우스, 키보드 및 터치 입력에 CoreWindow 입력 이벤트 콜백을 사용합니다.
- 게임 컨트롤러 지원(및 게임 컨트롤러 헤드셋 지원)에는 XInput 1.4를 사용합니다. 데스크톱 및 UWP에 공유 코드 베이스를 사용하는 경우 이전 버전과의 호환성에 대한 자세한 내용은 XInput 버전을 참조하세요.
- 게임에서 앱 바를 사용해야 하는 경우 EdgeGesture 이벤트에 등록합니다.
DirectShow 대신 Microsoft 미디어 파운데이션 사용
DirectShow는 더 이상 DirectX API(또는 Windows API)의 일부가 아닙니다. Microsoft 미디어 파운데이션은 공유 화면을 사용하여 Direct3D에 비디오 콘텐츠를 제공합니다. Direct3D 11 비디오 API를 참조하세요.
DirectPlay를 네트워킹 코드로 바꾸기
Microsoft DirectPlay는 더 이상 사용되지 않습니다. 게임에서 네트워크 서비스를 사용하는 경우 UWP 요구 사항을 준수하는 네트워킹 코드를 제공해야 합니다. 다음 API를 사용합니다.
- UWP 앱(네트워킹)(Windows)용 Win32 및 COM
- Windows.Networking 네임스페이스(Windows)
- Windows.Networking.Sockets 네임스페이스(Windows)
- Windows.Networking.Connectivity 네임스페이스(Windows)
- Windows.ApplicationModel.Background 네임스페이스(Windows)
다음 문서는 네트워킹 기능을 추가하고 앱의 패키지 매니페스트에서 네트워킹에 대한 지원을 선언하는 데 도움이 됩니다.
- 소켓을 사용하여 연결(C#/VB/C++ 및 XAML로 작성한 UWP 앱)(Windows)
- WebSocket을 사용하여 연결(C#/VB/C++ 및 XAML로 작성한 UWP 앱)(Windows)
- 웹 서비스에 연결(C#/VB/C++ 및 XAML로 작성한 UWP 앱)(Windows)
- 네트워킹 기본 사항
모든 UWP 앱(게임 포함)은 특정 유형의 백그라운드 작업을 사용하여 앱이 일시 중단되는 동안 연결을 유지 관리합니다. 게임이 일시 중단된 상태에서 연결 상태를 기본 확인해야 하는 경우 네트워킹 기본 사항을 참조하세요.
함수 매핑
다음 표를 사용하여 코드를 Direct3D 9에서 Direct3D 11로 변환할 수 있습니다. 디바이스 컨텍스트와 디바이스 컨텍스트를 구분하는 데도 도움이 될 수 있습니다.
Direct3D9 | Direct3D 11 등가물 |
---|---|
그래픽 파이프라인 단계는 그래픽 파이프라인에 설명되어 있습니다. |
|
DXGI_PRESENT_TEST 플래그가 설정된 IDXGISwapChain1::Present1을 호출합니다. |
|
ID3D11DeviceContext::DrawIndexed ID3D11DeviceContext::DrawIndexedInstanced ID3D11DeviceContext::DrawInstanced |
|
직접적으로 해당하는 항목이 없습니다. |
|
표준 커서 API를 사용합니다. |
|
LOST 디바이스 및 POOL_MANAGED가 더 이상 존재하지 않습니다. IDXGISwapChain1::Present1은 DXGI_ERROR_DEVICE_REMOVED 반환 값과 함께 실패할 수 있습니다. |
|
IDirect3DDevice9:DrawRectPatch IDirect3DDevice9:MultiplyTransform |
고정 함수 파이프라인은 더 이상 사용되지 않습니다. |
IDirect3DDevice9:CheckDepthStencilMatch IDirect3DDevice9:CheckDeviceFormat |
기능 비트는 기능 수준으로 대체됩니다. 지정된 기능 수준에서는 몇 가지 형식 및 기능 사용 사례만 선택 사항입니다. 이러한 항목은 ID3D11Device::CheckFeatureSupport 및 ID3D11Device::CheckFormatSupport를 통해 확인할 수 있습니다. |
Surface 형식 매핑
다음 표를 사용하여 Direct3D 9 형식을 DXGI 형식으로 변환합니다.
Direct3D 9 형식 | Direct3D 11 형식 |
---|---|
D3DFMT_UNKNOWN |
DXGI_FORMAT_UNKNOWN |
D3DFMT_R8G8B8 |
사용할 수 없음 |
D3DFMT_A8R8G8B8 |
DXGI_FORMAT_B8G8R8A8_UNORM DXGI_FORMAT_B8G8R8A8_UNORM_SRGB |
D3DFMT_X8R8G8B8 |
DXGI_FORMAT_B8G8R8X8_UNORM DXGI_FORMAT_B8G8R8X8_UNORM_SRGB |
D3DFMT_R5G6B5 |
DXGI_FORMAT_B5G6R5_UNORM |
D3DFMT_X1R5G5B5 |
사용할 수 없음 |
D3DFMT_A1R5G5B5 |
DXGI_FORMAT_B5G5R5A1_UNORM |
D3DFMT_A4R4G4B4 |
DXGI_FORMAT_B4G4R4A4_UNORM |
D3DFMT_R3G3B2 |
사용할 수 없음 |
D3DFMT_A8 |
DXGI_FORMAT_A8_UNORM |
D3DFMT_A8R3G3B2 |
사용할 수 없음 |
D3DFMT_X4R4G4B4 |
사용할 수 없음 |
D3DFMT_A2B10G10R10 |
DXGI_FORMAT_R10G10B10A2 |
D3DFMT_A8B8G8R8 |
DXGI_FORMAT_R8G8B8A8_UNORM DXGI_FORMAT_R8G8B8A8_UNORM_SRGB |
D3DFMT_X8B8G8R8 |
사용할 수 없음 |
D3DFMT_G16R16 |
DXGI_FORMAT_R16G16_UNORM |
D3DFMT_A2R10G10B10 |
사용할 수 없음 |
D3DFMT_A16B16G16R16 |
DXGI_FORMAT_R16G16B16A16_UNORM |
D3DFMT_A8P8 |
사용할 수 없음 |
D3DFMT_P8 |
사용할 수 없음 |
D3DFMT_L8 |
DXGI_FORMAT_R8_UNORM
참고 Direct3D 9 동작을 가져오려면 셰이더에서 .r swizzle을 사용하여 빨간색을 다른 구성 요소에 복제합니다.
|
D3DFMT_A8L8 |
DXGI_FORMAT_R8G8_UNORM
참고 Direct3D 9 동작을 가져오려면 셰이더에서 swizzle .rrrg를 사용하여 빨간색을 복제하고 녹색을 알파 구성 요소로 이동합니다.
|
D3DFMT_A4L4 |
사용할 수 없음 |
D3DFMT_V8U8 |
DXGI_FORMAT_R8G8_SNORM |
D3DFMT_L6V5U5 |
사용할 수 없음 |
D3DFMT_X8L8V8U8 |
사용할 수 없음 |
D3DFMT_Q8W8V8U8 |
DXGI_FORMAT_R8G8B8A8_SNORM |
D3DFMT_V16U16 |
DXGI_FORMAT_R16G16_SNORM |
D3DFMT_W11V11U10 |
사용할 수 없음 |
D3DFMT_A2W10V10U10 |
사용할 수 없음 |
D3DFMT_UYVY |
사용할 수 없음 |
D3DFMT_R8G8_B8G8 |
DXGI_FORMAT_G8R8_G8B8_UNORM
참고 Direct3D 9에서 데이터는 255.0f씩 스케일 업되었지만, 이는 셰이더에서 처리할 수 있습니다.
|
D3DFMT_YUY2 |
사용할 수 없음 |
D3DFMT_G8R8_G8B8 |
DXGI_FORMAT_R8G8_B8G8_UNORM
참고 Direct3D 9에서 데이터는 255.0f씩 스케일 업되었지만, 이는 셰이더에서 처리할 수 있습니다.
|
D3DFMT_DXT1 |
DXGI_FORMAT_BC1_UNORM & DXGI_FORMAT_BC1_UNORM_SRGB |
D3DFMT_DXT2 |
DXGI_FORMAT_BC1_UNORM & DXGI_FORMAT_BC1_UNORM_SRGB
참고 DXT1과 DXT2는 API/하드웨어 관점에서 동일합니다. 유일한 차이점은 미리 곱한 알파가 사용되는지 여부이며, 애플리케이션에서 추적할 수 있으며 별도의 형식이 필요하지 않습니다.
|
D3DFMT_DXT3 |
DXGI_FORMAT_BC2_UNORM & DXGI_FORMAT_BC2_UNORM_SRGB |
D3DFMT_DXT4 |
DXGI_FORMAT_BC2_UNORM & DXGI_FORMAT_BC2_UNORM_SRGB
참고 DXT3과 DXT4는 API/하드웨어 관점에서 동일합니다. 유일한 차이점은 미리 곱한 알파가 사용되는지 여부이며, 애플리케이션에서 추적할 수 있으며 별도의 형식이 필요하지 않습니다.
|
D3DFMT_DXT5 |
DXGI_FORMAT_BC3_UNORM & DXGI_FORMAT_BC3_UNORM_SRGB |
D3DFMT_D16 & D3DFMT_D16_LOCKABLE |
DXGI_FORMAT_D16_UNORM |
D3DFMT_D32 |
사용할 수 없음 |
D3DFMT_D15S1 |
사용할 수 없음 |
D3DFMT_D24S8 |
사용할 수 없음 |
D3DFMT_D24X8 |
사용할 수 없음 |
D3DFMT_D24X4S4 |
사용할 수 없음 |
D3DFMT_D16 |
DXGI_FORMAT_D16_UNORM |
D3DFMT_D32F_LOCKABLE |
DXGI_FORMAT_D32_FLOAT |
D3DFMT_D24FS8 |
사용할 수 없음 |
D3DFMT_S1D15 |
사용할 수 없음 |
D3DFMT_S8D24 |
DXGI_FORMAT_D24_UNORM_S8_UINT |
D3DFMT_X8D24 |
사용할 수 없음 |
D3DFMT_X4S4D24 |
사용할 수 없음 |
D3DFMT_L16 |
DXGI_FORMAT_R16_UNORM
참고 D3D9 동작을 가져오려면 셰이더에서 .r swizzle을 사용하여 빨간색을 다른 구성 요소에 복제합니다.
|
D3DFMT_INDEX16 |
DXGI_FORMAT_R16_UINT |
D3DFMT_INDEX32 |
DXGI_FORMAT_R32_UINT |
D3DFMT_Q16W16V16U16 |
DXGI_FORMAT_R16G16B16A16_SNORM |
D3DFMT_MULTI2_ARGB8 |
사용할 수 없음 |
D3DFMT_R16F |
DXGI_FORMAT_R16_FLOAT |
D3DFMT_G16R16F |
DXGI_FORMAT_R16G16_FLOAT |
D3DFMT_A16B16G16R16F |
DXGI_FORMAT_R16G16B16A16_FLOAT |
D3DFMT_R32F |
DXGI_FORMAT_R32_FLOAT |
D3DFMT_G32R32F |
DXGI_FORMAT_R32G32_FLOAT |
D3DFMT_A32B32G32R32F |
DXGI_FORMAT_R32G32B32A32_FLOAT |
D3DFMT_CxV8U8 |
사용할 수 없음 |
D3DDECLTYPE_FLOAT1 |
DXGI_FORMAT_R32_FLOAT |
D3DDECLTYPE_FLOAT2 |
DXGI_FORMAT_R32G32_FLOAT |
D3DDECLTYPE_FLOAT3 |
DXGI_FORMAT_R32G32B32_FLOAT |
D3DDECLTYPE_FLOAT4 |
DXGI_FORMAT_R32G32B32A32_FLOAT |
D3DDECLTYPED3DCOLOR |
사용할 수 없음 |
D3DDECLTYPE_UBYTE4 |
DXGI_FORMAT_R8G8B8A8_UINT
참고 셰이더에서 UINT 값을 가져오지만 Direct3D 9 스타일의 정수 부동 소수점 숫자(0.0f, 1.0f... 255.f)가 필요한 경우 셰이더에서 UINT를 float32로 변환할 수 있습니다.
|
D3DDECLTYPE_SHORT2 |
DXGI_FORMAT_R16G16_SINT
참고 셰이더에서 SINT 값을 가져오지만 Direct3D 9 스타일의 정수 부동 소수점 숫자가 필요한 경우 셰이더에서 SINT를 float32로 변환할 수 있습니다.
|
D3DDECLTYPE_SHORT4 |
DXGI_FORMAT_R16G16B16A16_SINT
참고 셰이더에서 SINT 값을 가져오지만 Direct3D 9 스타일의 정수 부동 소수점 숫자가 필요한 경우 셰이더에서 SINT를 float32로 변환할 수 있습니다.
|
D3DDECLTYPE_UBYTE4N |
DXGI_FORMAT_R8G8B8A8_UNORM |
D3DDECLTYPE_SHORT2N |
DXGI_FORMAT_R16G16_SNORM |
D3DDECLTYPE_SHORT4N |
DXGI_FORMAT_R16G16B16A16_SNORM |
D3DDECLTYPE_USHORT2N |
DXGI_FORMAT_R16G16_UNORM |
D3DDECLTYPE_USHORT4N |
DXGI_FORMAT_R16G16B16A16_UNORM |
D3DDECLTYPE_UDEC3 |
사용할 수 없음 |
D3DDECLTYPE_DEC3N |
사용할 수 없음 |
D3DDECLTYPE_FLOAT16_2 |
DXGI_FORMAT_R16G16_FLOAT |
D3DDECLTYPE_FLOAT16_4 |
DXGI_FORMAT_R16G16B16A16_FLOAT |
FourCC 'ATI1' |
DXGI_FORMAT_BC4_UNORM
참고 기능 수준 10.0 이상이 필요합니다.
|
FourCC 'ATI2' |
DXGI_FORMAT_BC5_UNORM
참고 기능 수준 10.0 이상이 필요합니다.
|
추가 매핑 정보
- IDirect3DDevice9::SetCursorPosition은 SetCursorPos로 대체됩니다.
- IDirect3DDevice9::SetCursorProperties는 replaced by SetCursor로 대체됩니다.
- IDirect3DDevice9::SetIndices는 ID3D11DeviceContext::IASetIndexBuffer로 대체됩니다.
- IDirect3DDevice9::SetRenderTarget은 ID3D11DeviceContext::OMSetRenderTargets로 대체됩니다.
- IDirect3DDevice9::SetScissorRect는 ID3D11DeviceContext::RSSetScissorRects로 대체됩니다.
- IDirect3DDevice9::SetStreamSource는 ID3D11DeviceContext::IASetVertexBuffers로 대체됩니다.
- IDirect3DDevice9::SetVertexDeclaration은 ID3D11DeviceContext::IASetInputLayout으로 대체됩니다.
- IDirect3DDevice9::SetViewport는 ID3D11DeviceContext::RSSetViewports로 대체됩니다.
- IDirect3DDevice9::ShowCursor는 ShowCursor로 대체됩니다.
IDirect3DDevice9::SetGammaRamp를 통한 비디오 카드의 하드웨어 감마 램프 제어는 IDXGIOutput::SetGammaControl로 대체됩니다. 감마 보정 사용을 참조하세요.
IDirect3DDevice9::ProcessVertices는 기하 도형 셰이더의 Stream-Output 기능으로 대체됩니다. 스트림 출력 단계 시작을 참조하세요.
사용자 클립 평면을 설정하는 IDirect3DDevice9::SetClipPlane 메서드는 VS_4_0 이상에서 사용 가능한 HLSL SV_ClipDistance 꼭짓점 셰이더 출력 의미 체계(의미 체계 참조) 또는 새 HLSL 클립 평면 함수 특성으로 대체되었습니다(기능 수준 9 하드웨어의 사용자 클립 평면 참조).
IDirect3DDevice9::SetPaletteEntries 및 IDirect3DDevice9::SetCurrentTexturePalette는 더 이상 사용되지 않습니다. 대신 256x1 R8G8B8A8 질감에서 색을 찾는 픽셀 셰이더로 대체합니다.
DrawRectPatch, DrawTriPatch, SetNPatchMode 및 DeletePatch와 같은 고정 기능 공간 분할 함수는 더 이상 사용되지 않습니다. 프로그래밍 가능한 파이프라인 SM5.0 공간 분할 셰이더로 대체합니다(하드웨어에서 공간 분할 셰이더를 지원하는 경우).
IDirect3DDevice9::SetFVF 및 FVF 코드는 더 이상 지원되지 않습니다. D3D11 입력 레이아웃으로 포팅하기 전에 D3D8/D3D9 FVF 코드에서 D3D9 꼭짓점 선언으로 포팅해야 합니다.
직접 지원되지 않는 모든 D3DDECLTYPE 형식은 VS_4_0 이상에서 적은 수의 비트 연산을 통해 꼭짓점 셰이더의 시작 부분에 상당히 효율적으로 에뮬레이트할 수 있습니다.