Bagikan melalui


Perubahan penting dari Direct3D 9 ke Direct3D 11

Ringkasan

Topik ini menjelaskan perbedaan tingkat tinggi antara DirectX 9 dan DirectX 11.

Direct3D 11 pada dasarnya adalah jenis API yang sama dengan Direct3D 9 - antarmuka virtual tingkat rendah ke dalam perangkat keras grafis. Ini masih memungkinkan Anda untuk melakukan operasi gambar grafis pada berbagai implementasi perangkat keras. Tata letak API grafis telah berubah sejak Direct3D 9; konsep konteks perangkat telah diperluas, dan API telah ditambahkan khusus untuk infrastruktur grafis. Sumber daya yang disimpan di perangkat Direct3D memiliki mekanisme baru untuk polimorfisme data yang disebut tampilan sumber daya.

Fungsi CORE API

Di Direct3D 9 Anda harus membuat antarmuka ke API Direct3D sebelum Anda dapat mulai menggunakannya. Dalam gim Direct3D 11 Platform Windows Universal (UWP), Anda memanggil fungsi statis yang disebut D3D11CreateDevice untuk membuat perangkat dan konteks perangkat.

Konteks perangkat dan perangkat

Perangkat Direct3D 11 mewakili adaptor grafis virtual. Ini digunakan untuk membuat sumber daya dalam memori video, misalnya: mengunggah tekstur ke GPU, membuat tampilan pada sumber daya tekstur dan rantai pertukaran, dan membuat sampel tekstur. Untuk daftar lengkap tentang apa antarmuka perangkat Direct3D 11 digunakan untuk melihat ID3D11Device dan ID3D11Device1.

Direct3D 11. konteks perangkat digunakan untuk mengatur status alur dan menghasilkan perintah penyajian. Misalnya, rantai penyajian Direct3D 11 menggunakan konteks perangkat untuk menyiapkan rantai penyajian dan menggambar adegan (lihat di bawah). Konteks perangkat digunakan untuk mengakses (peta) memori video yang digunakan oleh sumber daya perangkat Direct3D; ini juga digunakan untuk memperbarui data sub sumber daya, misalnya data buffer konstanta. Untuk daftar lengkap tentang apa konteks perangkat Direct3D 11 digunakan untuk melihat ID3D11DeviceContext dan ID3D11DeviceContext1. Perhatikan bahwa sebagian besar sampel kami menggunakan konteks langsung untuk dirender langsung ke perangkat, tetapi Direct3D 11 juga mendukung konteks perangkat yang ditangguhkan, yang terutama digunakan untuk multithreading.

Di Direct3D 11, handel perangkat dan handel konteks perangkat keduanya diperoleh dengan memanggil D3D11CreateDevice. Metode ini juga merupakan tempat Anda meminta serangkaian fitur perangkat keras tertentu dan mengambil informasi tentang tingkat fitur Direct3D yang didukung oleh adaptor grafis. Lihat Pengenalan Perangkat di Direct3D 11 untuk informasi selengkapnya tentang perangkat, konteks perangkat, dan pertimbangan utas.

Infrastruktur perangkat, buffer bingkai, dan tampilan target render

Di Direct3D 11, adaptor perangkat dan konfigurasi perangkat keras diatur dengan API DirectX Graphics Infrastructure (DXGI) menggunakan antarmuka IDXGIAdapter dan IDXGIDevice1 COM. Buffer dan sumber daya jendela lainnya (terlihat atau di luar layar) dibuat dan dikonfigurasi oleh antarmuka DXGI tertentu; implementasi pola pabrik IDXGIFactory2 memperoleh sumber daya DXGI seperti buffer bingkai. Karena DXGI memiliki rantai pertukaran, antarmuka DXGI digunakan untuk menyajikan bingkai ke layar - lihat IDXGISwapChain1.

Gunakan IDXGIFactory2 untuk membuat rantai pertukaran yang kompatibel dengan game Anda. Anda perlu membuat rantai pertukaran untuk jendela inti, atau untuk komposisi (interop XAML), alih-alih membuat rantai pertukaran untuk HWND.

Sumber daya perangkat dan tampilan sumber daya

Direct3D 11 mendukung tingkat polimorfisme tambahan pada sumber daya memori video yang dikenal sebagai tampilan. Pada dasarnya, di mana Anda memiliki satu objek Direct3D 9 untuk tekstur, Anda sekarang memiliki dua objek: sumber daya tekstur, yang menyimpan data, dan tampilan sumber daya, yang menunjukkan bagaimana tampilan digunakan untuk penyajian. Tampilan berdasarkan sumber daya memungkinkan sumber daya tersebut digunakan untuk tujuan tertentu. Misalnya, sumber daya tekstur 2D dibuat sebagai ID3D11Texture2D, lalu tampilan sumber daya shader (ID3D11ShaderResourceView) dibuat di atasnya sehingga dapat digunakan sebagai tekstur dalam shader. Tampilan target render (ID3D11RenderTargetView) juga dapat dibuat pada sumber daya tekstur 2D yang sama sehingga dapat digunakan sebagai permukaan gambar. Dalam contoh lain, data piksel yang sama diwakili dalam 2 format piksel yang berbeda dengan menggunakan 2 tampilan terpisah pada satu sumber daya tekstur.

Sumber daya yang mendasar harus dibuat dengan properti yang kompatibel dengan jenis tampilan yang akan dibuat darinya. Misalnya, jika ID3D11RenderTargetView diterapkan ke permukaan, permukaan tersebut dibuat dengan bendera D3D11_BIND_RENDER_TARGET. Permukaan juga harus memiliki format permukaan DXGI yang kompatibel dengan penyajian (lihat DXGI_FORMAT).

Sebagian besar sumber daya yang Anda gunakan untuk penyajian mewarisi dari antarmuka ID3D11Resource, yang mewarisi dari ID3D11DeviceChild. Buffer vertex, buffer indeks, buffer konstan, dan shader semuanya adalah sumber daya Direct3D 11. Tata letak input dan status sampler mewarisi langsung dari ID3D11DeviceChild.

Tampilan sumber daya menggunakan nilai enum DXGI_FORMAT untuk menunjukkan format piksel. Tidak setiap D3DFMT didukung sebagai DXGI_FORMAT. Misalnya, tidak ada format RGB 24bpp di DXGI yang setara dengan D3DFMT_R8G8B8. Ada juga tidak setara BGR dengan setiap format RGB (DXGI_FORMAT_R10G10B10A2_UNORM setara dengan D3DFMT_A2B10G10R10, tetapi tidak ada yang setara langsung dengan D3DFMT_A2R10G10B10). Anda harus berencana untuk mengonversi konten apa pun dalam format warisan ini ke format yang didukung pada build-time. Untuk daftar lengkap format DXGI, lihat enumerasi DXGI_FORMAT.

Sumber daya perangkat Direct3D (dan tampilan sumber daya) dibuat sebelum adegan dirender. Konteks perangkat digunakan untuk menyiapkan rantai penyajian, seperti yang dijelaskan di bawah ini.

Konteks perangkat dan rantai penyajian

Di Direct3D 9 dan Direct3D 10.x, ada satu objek perangkat Direct3D yang mengelola pembuatan, status, dan gambar sumber daya. Di Direct3D 11, antarmuka perangkat Direct3D masih mengelola pembuatan sumber daya, tetapi semua operasi status dan gambar ditangani dengan menggunakan konteks perangkat Direct3D. Berikut adalah contoh bagaimana konteks perangkat (antarmuka ID3D11DeviceContext1 ) digunakan untuk menyiapkan rantai penyajian:

  • Mengatur dan menghapus tampilan target render (dan tampilan stensil kedalaman)
  • Atur buffer vertex, buffer indeks, dan tata letak input untuk tahap perakitan input (tahap IA)
  • Mengikat vertex dan shader piksel ke alur
  • Ikat buffer konstanta ke shader
  • Mengikat tampilan tekstur dan sampler ke shader piksel
  • Gambar adegan

Ketika salah satu metode ID3D11DeviceContext::D raw dipanggil, adegan digambar pada tampilan target render. Setelah selesai, semua adaptor DXGI gambar Anda akan digunakan untuk menyajikan bingkai yang telah selesai dengan memanggil IDXGISwapChain1::P resent1.

Manajemen Status

Pengaturan status terkelola Direct3D 9 dengan sekumpulan besar pengalih individual yang diatur dengan metode SetRenderState, SetSamplerState, dan SetTextureStageState. Karena Direct3D 11 tidak mendukung alur fungsi tetap warisan, SetTextureStageState diganti dengan menulis piksel shader (PS). Tidak ada yang setara dengan blok status Direct3D 9. Direct3D 11 sebaliknya mengelola status melalui penggunaan 4 jenis objek status yang menyediakan cara yang lebih efisien untuk mengelompokkan status penyajian.

Misalnya, alih-alih menggunakan SetRenderState dengan D3DRS_ZENABLE, Anda membuat objek DepthStencilState dengan ini dan pengaturan status terkait lainnya dan menggunakannya untuk mengubah status saat penyajian.

Saat memindahkan aplikasi Direct3D 9 ke objek status, ketahuilah bahwa berbagai kombinasi status Anda diwakili sebagai objek status yang tidak dapat diubah. Mereka harus dibuat sekali dan digunakan kembali selama valid.

Tingkat fitur Direct3D

Direct3D memiliki mekanisme baru untuk menentukan dukungan perangkat keras yang disebut tingkat fitur. Tingkat fitur menyederhanakan tugas mencari tahu apa yang dapat dilakukan adaptor grafis dengan memungkinkan Anda meminta serangkaian fungsionalitas GPU yang ditentukan dengan baik. Misalnya, tingkat fitur 9_1 mengimplementasikan fungsionalitas yang disediakan oleh adaptor grafis Direct3D 9, termasuk model shader 2.x. Karena 9_1 adalah tingkat fitur terendah, Anda dapat mengharapkan semua perangkat mendukung shader vertex dan shader piksel, yang merupakan tahap yang sama yang didukung oleh model shader yang dapat diprogram Direct3D 9.

Game Anda akan menggunakan D3D11CreateDevice untuk membuat konteks perangkat dan perangkat Direct3D. Ketika Anda memanggil fungsi ini, Anda menyediakan daftar tingkat fitur yang dapat didukung game Anda. Ini akan mengembalikan tingkat fitur tertinggi yang didukung dari daftar tersebut. Misalnya jika game Anda dapat menggunakan tekstur BC4/BC5 (fitur perangkat keras DirectX 10), Anda akan menyertakan setidaknya 9_1 dan 10_0 dalam daftar tingkat fitur yang didukung. Jika game berjalan pada perangkat keras DirectX 9 dan tekstur BC4/BC5 tidak dapat digunakan, maka D3D11CreateDevice akan mengembalikan 9_1. Kemudian permainan Anda dapat jatuh kembali ke format tekstur yang berbeda (dan tekstur yang lebih kecil).

Jika Anda memutuskan untuk memperluas game Direct3D 9 anda untuk mendukung tingkat fitur Direct3D yang lebih tinggi maka lebih baik untuk menyelesaikan porting kode grafis Direct3D 9 yang ada terlebih dahulu. Setelah game anda bekerja di Direct3D 11, lebih mudah untuk menambahkan jalur penyajian tambahan dengan grafis yang disempurnakan.

Lihat Tingkat fitur Direct3D untuk penjelasan terperinci tentang dukungan tingkat fitur. Lihat Fitur Direct3D 11 dan Fitur Direct3D 11.1 untuk daftar lengkap fitur Direct3D 11.

Tingkat fitur dan alur yang dapat diprogram

Perangkat keras terus berkembang sejak Direct3D 9, dan beberapa tahap opsional baru telah ditambahkan ke alur grafis yang dapat diprogram. Kumpulan opsi yang Anda miliki untuk alur grafis bervariasi menurut tingkat fitur Direct3D. Tingkat fitur 10.0 mencakup tahap shader geometri dengan aliran opsional untuk penyajian multipass pada GPU. Tingkat fitur 11_0 termasuk shader lambung dan shader domain untuk digunakan dengan tessellation perangkat keras. Tingkat fitur 11_0 juga menyertakan dukungan penuh untuk shader DirectCompute, sementara tingkat fitur 10.x hanya menyertakan dukungan untuk bentuk terbatas DirectCompute.

Semua shader ditulis dalam HLSL menggunakan profil shader yang sesuai dengan tingkat fitur Direct3D. Profil shader kompatibel ke atas, sehingga shader HLSL yang mengkompilasi menggunakan vs_4_0_level_9_1 atau ps_4_0_level_9_1 akan berfungsi di semua perangkat. Profil shader tidak kompatibel dengan tingkat bawah, sehingga shader yang dikompilasi menggunakan vs_4_1 hanya akan berfungsi pada tingkat fitur 10_1, 11_0, atau perangkat 11_1.

Konstanta terkelola Direct3D 9 untuk shader menggunakan array bersama dengan SetVertexShaderConstant dan SetPixelShaderConstant. Direct3D 11 menggunakan buffer konstanta, yang merupakan sumber daya seperti buffer vertex atau buffer indeks. Buffer konstan dirancang untuk diperbarui secara efisien. Alih-alih mengatur semua konstanta shader ke dalam satu array global, Anda mengatur konstanta Anda ke dalam pengelompokan logis dan mengelolanya melalui satu atau beberapa buffer konstanta. Saat Anda memindahkan game Direct3D 9 ke Direct3D 11, rencanakan untuk mengatur buffer konstan Anda sehingga Anda dapat memperbaruinya dengan tepat. Misalnya, konstanta shader grup yang tidak diperbarui setiap bingkai menjadi buffer konstanta terpisah, sehingga Anda tidak perlu terus-menerus mengunggah data tersebut ke adaptor grafis bersama dengan konstanta shader yang lebih dinamis.

Catatan Sebagian Besar Aplikasi Direct3D 9 membuat penggunaan shader yang luas, tetapi kadang-kadang dicampur dalam penggunaan perilaku fungsi tetap warisan. Perhatikan bahwa Direct3D 11 hanya menggunakan model bayangan yang dapat diprogram. Fitur fungsi tetap warisan Direct3D 9 tidak digunakan lagi.