다음을 통해 공유


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 형식은 셰이더와 함께 사용하기에 편리합니다. 예를 들어 XMFLOAT4XMFLOAT4X4 상수 버퍼에 대한 데이터를 편리하게 정렬합니다.

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 앱(게임 포함)은 특정 유형의 백그라운드 작업을 사용하여 앱이 일시 중단되는 동안 연결을 유지 관리합니다. 게임이 일시 중단된 상태에서 연결 상태를 기본 확인해야 하는 경우 네트워킹 기본 사항을 참조하세요.

함수 매핑

다음 표를 사용하여 코드를 Direct3D 9에서 Direct3D 11로 변환할 수 있습니다. 디바이스 컨텍스트와 디바이스 컨텍스트를 구분하는 데도 도움이 될 수 있습니다.

Direct3D9 Direct3D 11 등가물

IDirect3DDevice9

ID3D11Device2

ID3D11DeviceContext2

그래픽 파이프라인 단계는 그래픽 파이프라인에 설명되어 있습니다.

IDirect3D9

IDXGIFactory2

IDXGIAdapter2

IDXGIDevice3

IDirect3DDevice9::Present

IDXGISwapChain1::Present1

IDirect3DDevice9::TestCooperativeLevel

DXGI_PRESENT_TEST 플래그가 설정된 IDXGISwapChain1::Present1을 호출합니다.

IDirect3DBaseTexture9

IDirect3DTexture9

IDirect3DCubeTexture9

IDirect3DVolumeTexture9

IDirect3DIndexBuffer9

IDirect3DVertexBuffer9

ID3D11Buffer

ID3D11Texture1D

ID3D11Texture2D

ID3D11Texture3D

ID3D11ShaderResourceView

ID3D11RenderTargetView

ID3D11DepthStencilView

IDirect3DVertexShader9

IDirect3DPixelShader9

ID3D11VertexShader

ID3D11PixelShader

IDirect3DVertexDeclaration9

ID3D11InputLayout

IDirect3DDevice9::SetRenderState

IDirect3DDevice9::SetSamplerState

ID3D11BlendState1

ID3D11DepthStencilState

ID3D11RasterizerState1

ID3D11SamplerState

IDirect3DDevice9::DrawIndexedPrimitive

IDirect3DDevice9::DrawPrimitive

ID3D11DeviceContext::Draw

ID3D11DeviceContext::DrawIndexed

ID3D11DeviceContext::DrawIndexedInstanced

ID3D11DeviceContext::DrawInstanced

ID3D11DeviceContext::IASetPrimitiveTopology

ID3D11DeviceContext::DrawAuto

IDirect3DDevice9::BeginScene

IDirect3DDevice9::EndScene

IDirect3DDevice9::DrawPrimitiveUP

IDirect3DDevice9::DrawIndexedPrimitiveUP

직접적으로 해당하는 항목이 없습니다.

IDirect3DDevice9::ShowCursor

IDirect3DDevice9::SetCursorPosition

IDirect3DDevice9::SetCursorProperties

표준 커서 API를 사용합니다.

IDirect3DDevice9::Reset

LOST 디바이스 및 POOL_MANAGED가 더 이상 존재하지 않습니다. IDXGISwapChain1::Present1DXGI_ERROR_DEVICE_REMOVED 반환 값과 함께 실패할 수 있습니다.

IDirect3DDevice9:DrawRectPatch

IDirect3DDevice9:DrawTriPatch

IDirect3DDevice9:LightEnable

IDirect3DDevice9:MultiplyTransform

IDirect3DDevice9:SetLight

IDirect3DDevice9:SetMaterial

IDirect3DDevice9:SetNPatchMode

IDirect3DDevice9:SetTransform

IDirect3DDevice9:SetFVF

IDirect3DDevice9:SetTextureStageState

고정 함수 파이프라인은 더 이상 사용되지 않습니다.

IDirect3DDevice9:CheckDepthStencilMatch

IDirect3DDevice9:CheckDeviceFormat

IDirect3DDevice9:GetDeviceCaps

IDirect3DDevice9:ValidateDevice

기능 비트는 기능 수준으로 대체됩니다. 지정된 기능 수준에서는 몇 가지 형식 및 기능 사용 사례만 선택 사항입니다. 이러한 항목은 ID3D11Device::CheckFeatureSupportID3D11Device::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::SetGammaRamp를 통한 비디오 카드의 하드웨어 감마 램프 제어는 IDXGIOutput::SetGammaControl로 대체됩니다. 감마 보정 사용을 참조하세요.

IDirect3DDevice9::ProcessVertices는 기하 도형 셰이더의 Stream-Output 기능으로 대체됩니다. 스트림 출력 단계 시작을 참조하세요.

사용자 클립 평면을 설정하는 IDirect3DDevice9::SetClipPlane 메서드는 VS_4_0 이상에서 사용 가능한 HLSL SV_ClipDistance 꼭짓점 셰이더 출력 의미 체계(의미 체계 참조) 또는 새 HLSL 클립 평면 함수 특성으로 대체되었습니다(기능 수준 9 하드웨어의 사용자 클립 평면 참조).

IDirect3DDevice9::SetPaletteEntriesIDirect3DDevice9::SetCurrentTexturePalette는 더 이상 사용되지 않습니다. 대신 256x1 R8G8B8A8 질감에서 색을 찾는 픽셀 셰이더로 대체합니다.

DrawRectPatch, DrawTriPatch, SetNPatchModeDeletePatch와 같은 고정 기능 공간 분할 함수는 더 이상 사용되지 않습니다. 프로그래밍 가능한 파이프라인 SM5.0 공간 분할 셰이더로 대체합니다(하드웨어에서 공간 분할 셰이더를 지원하는 경우).

IDirect3DDevice9::SetFVF 및 FVF 코드는 더 이상 지원되지 않습니다. D3D11 입력 레이아웃으로 포팅하기 전에 D3D8/D3D9 FVF 코드에서 D3D9 꼭짓점 선언으로 포팅해야 합니다.

직접 지원되지 않는 모든 D3DDECLTYPE 형식은 VS_4_0 이상에서 적은 수의 비트 연산을 통해 꼭짓점 셰이더의 시작 부분에 상당히 효율적으로 에뮬레이트할 수 있습니다.