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 API Direct3D 9 ke DirectX 11
Direct3D masih menjadi 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 gambar primitif, dan menggunakan shader piksel untuk menambahkan efek khusus.
Karena Direct2D didasarkan pada Direct3D, ia juga menggunakan konteks DXGI dan perangkat. Lihat Gambaran Umum API Direct2D.
API DirectWrite menambahkan dukungan untuk teks yang diformat menggunakan Direct2D. Lihat Memperkenalkan DirectWrite.
Ganti 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 seperti pemuatan tekstur dan pemuatan jala.
- Port Sederhana dari Direct3D 9 ke panduan UWP menunjukkan cara menyiapkan jendela, menginisialisasi Direct3D, dan melakukan penyajian 3D dasar.
- Game UWP Sederhana dengan panduan DirectX menunjukkan tugas pemrograman game umum termasuk grafis, memuat file, UI, kontrol, dan suara.
- Proyek komunitas DirectX Tool Kit menawarkan kelas pembantu untuk digunakan dengan aplikasi Direct3D 11 dan UWP.
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 pada runtime, maka setiap sumber daya shader terikat ke alur grafis selama pass penyajian yang sesuai. Shader harus dipindahkan ke terpisah mereka sendiri. File HLSL dan teknik penyajian harus diimplementasikan dalam kode C++Anda.
Untuk melihat sekilas memuat 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 meratakan data dengan nyaman untuk buffer konstanta.
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.
Menggunakan 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:
- Win32 dan COM untuk aplikasi UWP (jaringan) (Windows)
- Namespace layanan Windows.Networking (Windows)
- Namespace Layanan Windows.Networking.Sockets (Windows)
- Namespace layanan Windows.Networking.Connectivity (Windows)
- Namespace layanan Windows.ApplicationModel.Background (Windows)
Artikel berikut membantu Anda menambahkan fitur jaringan dan mendeklarasikan dukungan untuk jaringan dalam manifes paket aplikasi Anda.
- Menyambungkan dengan soket (aplikasi UWP menggunakan C#/VB/C++ dan XAML) (Windows)
- Menyambungkan dengan WebSockets (aplikasi UWP menggunakan C#/VB/C++ dan XAML) (Windows)
- Menyambungkan ke layanan web (aplikasi UWP menggunakan C#/VB/C++ dan XAML) (Windows)
- Dasar-dasar jaringan
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 |
---|---|
Tahapan alur grafis dijelaskan dalam Alur Grafis. |
|
Panggil IDXGISwapChain1::P resent1 dengan set bendera DXGI_PRESENT_TEST. |
|
ID3D11DeviceContext::D rawIndexed ID3D11DeviceContext::D rawIndexedInstanced ID3D11DeviceContext::D rawInstanced |
|
Tidak ada yang setara langsung |
|
Gunakan API kursor standar. |
|
Perangkat LOST dan POOL_MANAGED tidak ada lagi. IDXGISwapChain1::P resent1 dapat gagal dengan nilai pengembalian DXGI_ERROR_DEVICE_REMOVED . |
|
IDirect3DDevice9:DrawRectPatch IDirect3DDevice9:MultiplyTransform |
Alur fungsi tetap tidak digunakan lagi. |
IDirect3DDevice9:CheckDepthStencilMatch IDirect3DDevice9:CheckDeviceFormat |
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 di shader untuk menduplikasi merah ke komponen lain untuk mendapatkan perilaku Direct3D 9.
|
D3DFMT_A8L8 |
DXGI_FORMAT_R8G8_UNORM
Catatan Gunakan swizzle .rrrg di 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 di 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 di 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 yang telah diisi sebelumnya 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 yang telah diisi sebelumnya 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 di 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 di 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
- IDirect3DDevice9::SetCursorPosition digantikan oleh SetCursorPos.
- IDirect3DDevice9::SetCursorProperties digantikan oleh SetCursor.
- IDirect3DDevice9::SetIndices digantikan oleh ID3D11DeviceContext::IASetIndexBuffer.
- IDirect3DDevice9::SetRenderTarget digantikan oleh ID3D11DeviceContext::OMSetRenderTargets.
- IDirect3DDevice9::SetScissorRect digantikan oleh ID3D11DeviceContext::RSSetScissorRects.
- IDirect3DDevice9::SetStreamSource digantikan oleh ID3D11DeviceContext::IASetVertexBuffers.
- IDirect3DDevice9::SetVertexDeclaration digantikan oleh ID3D11DeviceContext::IASetInputLayout.
- IDirect3DDevice9::SetViewport digantikan oleh ID3D11DeviceContext::RSSetViewports.
- IDirect3DDevice9::ShowCursor digantikan oleh ShowCursor.
Kontrol ramp gamma perangkat keras kartu video melalui IDirect3DDevice9::SetGammaRamp digantikan oleh IDXGIOutput::SetGammaControl. Lihat Menggunakan koreksi gamma.
IDirect3DDevice9::P rocessVertices digantikan oleh fungsionalitas Stream-Output dari Geometry Shaders. Lihat Mulai menggunakan Tahap Stream-Output.
Metode IDirect3DDevice9::SetClipPlane untuk mengatur clip-plane pengguna digantikan oleh HLSL SV_ClipDistance semantik output shader vertex (lihat Semantik), tersedia dalam VS_4_0 dan ke atas, atau atribut fungsi clipplanes HLSL baru (lihat Bidang klip pengguna pada perangkat keras tingkat 9 fitur).
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 SM5.0 Tessellation 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 port 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.