Memetakan fitur DirectX 9 ke API DirectX 11

Pahami bagaimana fitur yang digunakan game Direct3D 9 Anda akan diterjemahkan ke Direct3D 11 dan Platform Windows Universal (UWP).

Lihat juga Merencanakan port DirectX Anda, dan Perubahan penting dari Direct3D 9 ke Direct3D 11.

Memetakan DIRECT3D 9 ke DIRECTX 11 API

Direct3D masih merupakan fondasi grafik DirectX, tetapi API telah berubah sejak DirectX 9:

  • Microsoft DirectX Graphics Infrastructure (DXGI) digunakan untuk menyiapkan adaptor grafis. Gunakan DXGI untuk memilih format buffer, membuat rantai pertukaran, menyajikan bingkai, dan membuat sumber daya bersama. Lihat Gambaran Umum DXGI.
  • Konteks perangkat Direct3D digunakan untuk mengatur status alur dan menghasilkan perintah penyajian. Sebagian besar sampel kami menggunakan konteks langsung untuk dirender langsung ke perangkat; Direct3D 11 juga mendukung rendering multithreaded, dalam hal ini konteks yang ditangguhkan digunakan. Lihat Pengantar Perangkat di Direct3D 11.
  • Beberapa fitur tidak digunakan lagi, terutama alur fungsi tetap. Lihat Fitur yang Tidak Digunakan Lagi.

Untuk daftar lengkap fitur Direct3D 11, lihat Fitur Direct3D 11 dan Fitur Direct3D 11.

Berpindah dari Direct2D 9 ke Direct2D 11

Direct2D (Windows) masih merupakan bagian penting dari grafik DirectX dan Windows. Anda masih dapat menggunakan Direct2D untuk menggambar game 2D, dan untuk menggambar overlay (HUD) di atas Direct3D.

Direct2D berjalan di atas Direct3D; Game 2D dapat diimplementasikan menggunakan salah satu API. Misalnya, game 2D yang diimplementasikan menggunakan Direct3D dapat menggunakan proyeksi ortografis, mengatur nilai Z untuk mengontrol urutan menggambar primitif, dan menggunakan pemecah piksel untuk menambahkan efek khusus.

Karena Direct2D didasarkan pada Direct3D, direct3D juga menggunakan DXGI dan konteks perangkat. Lihat Gambaran Umum API Direct2D.

API DirectWrite menambahkan dukungan untuk teks yang diformat menggunakan Direct2D. Lihat Memperkenalkan DirectWrite.

Mengganti pustaka pembantu yang tidak digunakan lagi

D3DX dan DXUT tidak digunakan lagi dan tidak dapat digunakan oleh game UWP. Pustaka pembantu ini menyediakan sumber daya untuk tugas-tugas seperti pemuatan tekstur dan pemuatan jala.

Memindahkan program shader dari FX ke HLSL

Pustaka utilitas D3DX (D3DX 9, D3DX 10, dan D3DX 11), termasuk Efek, tidak digunakan lagi untuk UWP. Semua game DirectX untuk UWP mendorong alur grafis menggunakan HLSL tanpa Efek.

Visual Studio masih menggunakan FXC di bawah kap untuk mengkompilasi objek shader. Shader game UWP dikompilasi sebelumnya. Bytecode dimuat saat runtime, maka setiap sumber daya shader terikat ke alur grafis selama kode penyajian yang sesuai. Shader harus dipindahkan ke terpisah mereka sendiri. File HLSL dan teknik penyajian harus diimplementasikan dalam kode C++ Anda.

Untuk melihat sekilas pemuatan sumber daya shader, lihat Port sederhana dari Direct3D 9 ke UWP.

Direct3D 11 memperkenalkan Shader Model 5, yang memerlukan fitur Direct3D tingkat 11_0 (atau lebih tinggi). Lihat Fitur HLSL Shader Model 5 untuk Direct3D 11.

Ganti XNAMath dan D3DXMath

Kode yang menggunakan XNAMath (atau D3DXMath) harus dimigrasikan ke DirectXMath. DirectXMath mencakup jenis yang portabel di x86, x64, dan Arm. Lihat Migrasi Kode dari Pustaka Matematika XNA.

Perhatikan bahwa jenis float DirectXMath nyaman digunakan dengan shader. Misalnya XMFLOAT4 dan XMFLOAT4X4 dengan mudah menyelaraskan data untuk buffer konstan.

Ganti DirectSound dengan XAudio2 (dan audio latar belakang)

DirectSound tidak didukung untuk UWP:

  • Gunakan XAudio2 untuk menambahkan efek suara ke game Anda.

Ganti DirectInput dengan API XInput dan Windows Runtime

DirectInput tidak didukung untuk UWP:

  • Gunakan panggilan balik peristiwa input CoreWindow untuk mouse, keyboard, dan input sentuh.
  • Gunakan XInput 1.4 untuk dukungan pengontrol game (dan dukungan headset pengontrol game). Jika Anda menggunakan basis kode bersama untuk desktop dan UWP, lihat Versi XInput untuk informasi tentang kompatibilitas mundur.
  • Daftar untuk peristiwa EdgeGesture jika game Anda perlu menggunakan bilah aplikasi.

Gunakan Microsoft Media Foundation alih-alih DirectShow

DirectShow bukan lagi bagian dari DirectX API (atau Windows API). Microsoft Media Foundation menyediakan konten video ke Direct3D menggunakan permukaan bersama. Lihat API Video Direct3D 11.

Ganti DirectPlay dengan kode jaringan

Microsoft DirectPlay tidak digunakan lagi. Jika game Anda menggunakan layanan jaringan, Anda perlu menyediakan kode jaringan yang sesuai dengan persyaratan UWP. Gunakan API berikut:

Artikel berikut membantu Anda menambahkan fitur jaringan dan mendeklarasikan dukungan untuk jaringan dalam manifes paket aplikasi Anda.

Perhatikan bahwa semua aplikasi UWP (termasuk game) menggunakan jenis tugas latar belakang tertentu untuk mempertahankan konektivitas saat aplikasi ditangguhkan. Jika game Anda perlu mempertahankan status koneksi saat ditangguhkan, lihat Dasar-dasar jaringan.

Pemetaan fungsi

Gunakan tabel berikut untuk membantu mengonversi kode dari Direct3D 9 ke Direct3D 11. Ini juga dapat membantu membedakan antara konteks perangkat dan perangkat.

Direct3D9 Direct3D 11 Setara

IDirect3DDevice9

ID3D11Device2

ID3D11DeviceContext2

Tahapan alur grafik dijelaskan dalam Alur Grafis.

IDirect3D9

IDXGIFactory2

IDXGIAdapter2

IDXGIDevice3

IDirect3DDevice9::P resent

IDXGISwapChain1::P resent1

IDirect3DDevice9::TestCooperativeLevel

Panggil IDXGISwapChain1::P resent1 dengan bendera DXGI_PRESENT_TEST diatur.

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::D rawIndexedPrimitive

IDirect3DDevice9::D rawPrimitive

ID3D11DeviceContext::D raw

ID3D11DeviceContext::D rawIndexed

ID3D11DeviceContext::D rawIndexedInstanced

ID3D11DeviceContext::D rawInstanced

ID3D11DeviceContext::IASetPrimitiveTopology

ID3D11DeviceContext::D rawAuto

IDirect3DDevice9::BeginScene

IDirect3DDevice9::EndScene

IDirect3DDevice9::D rawPrimitiveUP

IDirect3DDevice9::D rawIndexedPrimitiveUP

Tidak ada yang setara langsung

IDirect3DDevice9::ShowCursor

IDirect3DDevice9::SetCursorPosition

IDirect3DDevice9::SetCursorProperties

Gunakan API kursor standar.

IDirect3DDevice9::Reset

Perangkat LOST dan POOL_MANAGED tidak ada lagi. IDXGISwapChain1::P resent1 dapat gagal dengan nilai pengembalian DXGI_ERROR_DEVICE_REMOVED .

IDirect3DDevice9:DrawRectPatch

IDirect3DDevice9:DrawTriPatch

IDirect3DDevice9:LightEnable

IDirect3DDevice9:MultiplyTransform

IDirect3DDevice9:SetLight

IDirect3DDevice9:SetMaterial

IDirect3DDevice9:SetNPatchMode

IDirect3DDevice9:SetTransform

IDirect3DDevice9:SetFVF

IDirect3DDevice9:SetTextureStageState

Alur fungsi tetap tidak digunakan lagi.

IDirect3DDevice9:CheckDepthStencilMatch

IDirect3DDevice9:CheckDeviceFormat

IDirect3DDevice9:GetDeviceCaps

IDirect3DDevice9:ValidateDevice

Bit kemampuan digantikan oleh tingkat fitur. Hanya beberapa format dan kasus penggunaan fitur yang bersifat opsional untuk tingkat fitur tertentu. Ini dapat diperiksa dengan ID3D11Device::CheckFeatureSupport dan ID3D11Device::CheckFormatSupport.

Pemetaan format permukaan

Gunakan tabel berikut untuk mengonversi format Direct3D 9 menjadi format DXGI.

Direct3D 9 Format Direct3D 11 Format

D3DFMT_UNKNOWN

DXGI_FORMAT_UNKNOWN

D3DFMT_R8G8B8

Tidak tersedia

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

Tidak tersedia

D3DFMT_A1R5G5B5

DXGI_FORMAT_B5G5R5A1_UNORM

D3DFMT_A4R4G4B4

DXGI_FORMAT_B4G4R4A4_UNORM

D3DFMT_R3G3B2

Tidak tersedia

D3DFMT_A8

DXGI_FORMAT_A8_UNORM

D3DFMT_A8R3G3B2

Tidak tersedia

D3DFMT_X4R4G4B4

Tidak tersedia

D3DFMT_A2B10G10R10

DXGI_FORMAT_R10G10B10A2

D3DFMT_A8B8G8R8

DXGI_FORMAT_R8G8B8A8_UNORM

DXGI_FORMAT_R8G8B8A8_UNORM_SRGB

D3DFMT_X8B8G8R8

Tidak tersedia

D3DFMT_G16R16

DXGI_FORMAT_R16G16_UNORM

D3DFMT_A2R10G10B10

Tidak tersedia

D3DFMT_A16B16G16R16

DXGI_FORMAT_R16G16B16A16_UNORM

D3DFMT_A8P8

Tidak tersedia

D3DFMT_P8

Tidak tersedia

D3DFMT_L8

DXGI_FORMAT_R8_UNORM

Catatan Gunakan .r swizzle dalam shader untuk menduplikasi merah ke komponen lain untuk mendapatkan perilaku Direct3D 9.
 

D3DFMT_A8L8

DXGI_FORMAT_R8G8_UNORM

Catatan Gunakan swizzle .rrrg dalam shader untuk menduplikasi merah dan memindahkan hijau ke komponen alfa untuk mendapatkan perilaku Direct3D 9.
 

D3DFMT_A4L4

Tidak tersedia

D3DFMT_V8U8

DXGI_FORMAT_R8G8_SNORM

D3DFMT_L6V5U5

Tidak tersedia

D3DFMT_X8L8V8U8

Tidak tersedia

D3DFMT_Q8W8V8U8

DXGI_FORMAT_R8G8B8A8_SNORM

D3DFMT_V16U16

DXGI_FORMAT_R16G16_SNORM

D3DFMT_W11V11U10

Tidak tersedia

D3DFMT_A2W10V10U10

Tidak tersedia

D3DFMT_UYVY

Tidak tersedia

D3DFMT_R8G8_B8G8

DXGI_FORMAT_G8R8_G8B8_UNORM

Catatan Di Direct3D 9, data ditingkatkan skalanya sebesar 255,0f, tetapi ini dapat ditangani dalam shader.
 

D3DFMT_YUY2

Tidak tersedia

D3DFMT_G8R8_G8B8

DXGI_FORMAT_R8G8_B8G8_UNORM

Catatan Di Direct3D 9, data ditingkatkan skalanya sebesar 255,0f, tetapi ini dapat ditangani dalam shader.
 

D3DFMT_DXT1

DXGI_FORMAT_BC1_UNORM & DXGI_FORMAT_BC1_UNORM_SRGB

D3DFMT_DXT2

DXGI_FORMAT_BC1_UNORM & DXGI_FORMAT_BC1_UNORM_SRGB

Catatan DXT1 dan DXT2 sama dari perspektif API/perangkat keras. Satu-satunya perbedaan adalah apakah alfa pra-tip digunakan, yang dapat dilacak oleh aplikasi dan tidak memerlukan format terpisah.
 

D3DFMT_DXT3

DXGI_FORMAT_BC2_UNORM & DXGI_FORMAT_BC2_UNORM_SRGB

D3DFMT_DXT4

DXGI_FORMAT_BC2_UNORM & DXGI_FORMAT_BC2_UNORM_SRGB

Catatan DXT3 dan DXT4 sama dari perspektif API/perangkat keras. Satu-satunya perbedaan adalah apakah alfa pra-tip digunakan, yang dapat dilacak oleh aplikasi dan tidak memerlukan format terpisah.
 

D3DFMT_DXT5

DXGI_FORMAT_BC3_UNORM & DXGI_FORMAT_BC3_UNORM_SRGB

D3DFMT_D16 & D3DFMT_D16_LOCKABLE

DXGI_FORMAT_D16_UNORM

D3DFMT_D32

Tidak tersedia

D3DFMT_D15S1

Tidak tersedia

D3DFMT_D24S8

Tidak tersedia

D3DFMT_D24X8

Tidak tersedia

D3DFMT_D24X4S4

Tidak tersedia

D3DFMT_D16

DXGI_FORMAT_D16_UNORM

D3DFMT_D32F_LOCKABLE

DXGI_FORMAT_D32_FLOAT

D3DFMT_D24FS8

Tidak tersedia

D3DFMT_S1D15

Tidak tersedia

D3DFMT_S8D24

DXGI_FORMAT_D24_UNORM_S8_UINT

D3DFMT_X8D24

Tidak tersedia

D3DFMT_X4S4D24

Tidak tersedia

D3DFMT_L16

DXGI_FORMAT_R16_UNORM

Catatan Gunakan .r swizzle dalam shader untuk menduplikasi merah ke komponen lain untuk mendapatkan perilaku D3D9.
 

D3DFMT_INDEX16

DXGI_FORMAT_R16_UINT

D3DFMT_INDEX32

DXGI_FORMAT_R32_UINT

D3DFMT_Q16W16V16U16

DXGI_FORMAT_R16G16B16A16_SNORM

D3DFMT_MULTI2_ARGB8

Tidak tersedia

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

Tidak tersedia

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

Tidak tersedia

D3DDECLTYPE_UBYTE4

DXGI_FORMAT_R8G8B8A8_UINT

Catatan Shader mendapatkan nilai UINT, tetapi jika float integral gaya Direct3D 9 diperlukan (0,0f, 1,0f... 255.f), UINT hanya dapat dikonversi ke float32 dalam shader.
 

D3DDECLTYPE_SHORT2

DXGI_FORMAT_R16G16_SINT

Catatan Shader mendapatkan nilai SINT, tetapi jika float integral gaya Direct3D 9 diperlukan, SINT hanya dapat dikonversi ke float32 di shader.
 

D3DDECLTYPE_SHORT4

DXGI_FORMAT_R16G16B16A16_SINT

Catatan Shader mendapatkan nilai SINT, tetapi jika float integral gaya Direct3D 9 diperlukan, SINT hanya dapat dikonversi ke float32 di shader.
 

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

Tidak tersedia

D3DDECLTYPE_DEC3N

Tidak tersedia

D3DDECLTYPE_FLOAT16_2

DXGI_FORMAT_R16G16_FLOAT

D3DDECLTYPE_FLOAT16_4

DXGI_FORMAT_R16G16B16A16_FLOAT

FourCC 'ATI1'

DXGI_FORMAT_BC4_UNORM

Catatan Memerlukan Tingkat Fitur 10.0 atau yang lebih baru
 

FourCC 'ATI2'

DXGI_FORMAT_BC5_UNORM

Catatan Memerlukan Tingkat Fitur 10.0 atau yang lebih baru
 

Info pemetaan tambahan

Kontrol ramp gamma perangkat keras kartu video melalui IDirect3DDevice9::SetGammaRamp digantikan oleh IDXGIOutput::SetGammaControl. Lihat Menggunakan koreksi gamma.

IDirect3DDevice9::P rocessVertices digantikan oleh Stream-Output fungsionalitas Geometry Shaders. Lihat Mulai menggunakan Tahap Stream-Output.

Metode IDirect3DDevice9::SetClipPlane untuk mengatur clip-plane pengguna digantikan oleh semantik output HLSL SV_ClipDistance vertex shader (lihat Semantik), tersedia di VS_4_0 dan yang lebih baru, atau atribut fungsi clipplanes HLSL baru (lihat Bidang klip pengguna pada perangkat keras tingkat fitur 9).

IDirect3DDevice9::SetPaletteEntries dan IDirect3DDevice9::SetCurrentTexturePalette tidak digunakan lagi. Ganti ini dengan shader piksel yang mencari warna dalam tekstur 256x1 R8G8B8A8 sebagai gantinya.

Fungsi tessellation fungsi tetap seperti DrawRectPatch, DrawTriPatch, SetNPatchMode, dan DeletePatch tidak digunakan lagi. Ganti ini dengan shader Tessellation SM5.0 yang dapat diprogram (jika perangkat keras mendukung shader tessellation).

Kode IDirect3DDevice9::SetFVF, dan FVF, tidak lagi didukung. Anda harus mem-port dari kode FVF D3D8/D3D9 ke Deklarasi Vertex D3D9 sebelum memindahkan ke Tata Letak Input D3D11.

Semua jenis D3DDECLTYPE yang tidak didukung secara langsung dapat ditiru secara cukup efisien dengan sejumlah kecil operasi bitwise di awal shader vertex di VS_4_0 dan ke atas.