Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
API penting
Jika Anda mentransfer game dari platform iOS atau Android, Anda mungkin telah melakukan investasi signifikan di OpenGL ES 2.0. Saat bersiap memindahkan basis kode alur grafis Anda ke Direct3D 11 dan Windows Runtime, ada beberapa hal yang harus Anda pertimbangkan sebelum memulai.
Sebagian besar upaya porting biasanya melibatkan awalnya berjalan basis kode dan memetakan API dan pola umum antara kedua model. Anda akan menemukan proses ini sedikit lebih mudah jika Anda meluangkan waktu untuk membaca dan meninjau topik ini.
Berikut adalah beberapa hal yang perlu diperhatikan saat porting grafis dari OpenGL ES 2.0 ke Direct3D 11.
Catatan tentang penyedia OpenGL ES 2.0 tertentu
Topik porting di bagian ini mereferensikan implementasi Windows dari spesifikasi OpenGL ES 2.0 yang dibuat oleh Grup Khronos. Semua sampel kode OpenGL ES 2.0 dikembangkan menggunakan Visual Studio 2012 dan sintaks Windows C dasar. Jika Anda berasal dari basis kode Objective-C (iOS) atau Java (Android), ketahuilah bahwa sampel kode OpenGL ES 2.0 yang disediakan mungkin tidak menggunakan sintaks atau parameter panggilan API serupa. Panduan ini mencoba untuk tetap agnostik platform mungkin.
Dokumentasi ini hanya menggunakan API spesifikasi 2.0 untuk kode dan referensi OpenGL ES. Jika Anda melakukan porting dari OpenGL ES 1.1 atau 3.0, konten ini masih dapat terbukti berguna, meskipun beberapa contoh dan konteks kode OpenGL ES 2.0 mungkin tidak dikenal.
Sampel Direct3D 11 dalam topik ini menggunakan Microsoft Windows C++ dengan Ekstensi Komponen (CX). Untuk informasi selengkapnya tentang versi sintaks C++ini, baca Visual C++, Ekstensi Komponen untuk Platform Runtime, dan Referensi Cepat (C++\CX).
Memahami persyaratan dan sumber daya perangkat keras Anda
Serangkaian fitur pemrosesan grafis yang didukung oleh OpenGL ES 2.0 kira-kira memetakan ke fitur yang disediakan dalam Direct3D 9.1. Jika Anda ingin memanfaatkan fitur yang lebih canggih yang disediakan di Direct3D 11, tinjau dokumentasi Direct3D 11 saat merencanakan port Anda, atau tinjau topik Port dari DirectX 9 ke Platform Windows Universal (UWP) ketika Anda selesai dengan upaya awal.
Untuk mempermudah upaya port awal Anda, mulailah dengan templat Visual Studio Direct3D. Ini menyediakan perender dasar yang sudah dikonfigurasi untuk Anda, dan mendukung fitur aplikasi UWP seperti membuat ulang sumber daya pada perubahan jendela dan tingkat fitur Direct3D.
Memahami tingkat fitur Direct3D
Direct3D 11 menyediakan dukungan untuk "tingkat fitur" perangkat keras dari 9_1 (Direct3D 9.1) untuk 11_1. Tingkat fitur ini menunjukkan ketersediaan fitur dan sumber daya grafis tertentu. Biasanya, sebagian besar platform OpenGL ES 2.0 mendukung serangkaian fitur Direct3D 9.1 (tingkat fitur 9_1).
Tinjau fitur dan API grafis DirectX
Keluarga API | Deskripsi |
---|---|
DXGI | DirectX Graphics Infrastructure (DXGI) menyediakan antarmuka antara perangkat keras grafis dan Direct3D. Ini mengatur adaptor perangkat dan konfigurasi perangkat keras menggunakan antarmuka IDXGIAdapter dan IDXGIDevice1 COM. Gunakan untuk membuat dan mengonfigurasi buffer dan sumber daya jendela lainnya. Terutama, pola pabrik IDXGIFactory2 iis digunakan untuk memperoleh sumber daya grafis, termasuk rantai pertukaran (satu set buffer bingkai). Karena DXGI memiliki rantai pertukaran, antarmuka IDXGISwapChain1 digunakan untuk menyajikan bingkai ke layar. |
Direct3D | Direct3D adalah sekumpulan API yang menyediakan representasi virtual antarmuka grafis dan memungkinkan Anda menggambar grafik menggunakannya. Versi 11, kira-kira sebanding, bijaksana fitur, dengan OpenGL 4.3. (OpenGL ES 2.0, di sisi lain, mirip dengan DirectX9, feature-wise, dan OpenGL 2.0, tetapi dengan alur shader terpadu OpenGL 3.0.) Sebagian besar pengangkatan berat dilakukan dengan antarmuka ID3D11Device1 dan ID3D11DeviceContext1 yang menyediakan akses ke sumber daya dan sub sumber daya individual, dan konteks penyajian, masing-masing. |
Direct2D | Direct2D menyediakan sekumpulan API untuk penyajian 2D yang dipercepat GPU. Ini dapat dianggap mirip dengan tujuan OpenVG. |
DirectWrite | DirectWrite menyediakan sekumpulan API untuk penyajian font berkualitas tinggi yang dipercepat GPU. |
DirectXMath | DirectXMath menyediakan sekumpulan API dan makro untuk menangani aljabar linier umum dan jenis, nilai, dan fungsi trigonometri. Jenis dan fungsi ini dirancang untuk bekerja dengan baik dengan Direct3D dan operasi shader-nya. |
DirectX HLSL | Sintaks HLSL saat ini digunakan oleh shader Direct3D. Ini mengimplementasikan Direct3D Shader Model 5.0. |
Tinjau API Runtime Windows dan pustaka templat
WINDOWS Runtime API menyediakan infrastruktur keseluruhan untuk aplikasi UWP. Tinjau di sini.
API Runtime Windows utama yang digunakan dalam porting alur grafis Anda meliputi:
- Windows::UI::Core::CoreWindow
- Windows::UI::Core::CoreDispatcher
- Windows::ApplicationModel::Core::IFrameworkView
- Windows::ApplicationModel::Core::CoreApplicationView
Selain itu, Windows Runtime C++ Template Library (WRL) adalah pustaka templat yang menyediakan cara tingkat rendah untuk menulis dan menggunakan komponen Windows Runtime. API Direct3D 11 untuk aplikasi UWP paling baik digunakan bersama dengan antarmuka dan jenis di pustaka ini, seperti penunjuk cerdas (ComPtr). Untuk informasi selengkapnya tentang WRL, baca Windows Runtime C++ Template Library (WRL).
Mengubah sistem koordinat Anda
Salah satu perbedaan yang terkadang membingungkan upaya port awal adalah perubahan dari sistem koordinat tangan kanan tradisional OpenGL ke sistem koordinat kidal default Direct3D. Perubahan pemodelan koordinat ini memengaruhi banyak bagian permainan Anda, dari penyiapan dan konfigurasi buffer vertex Anda ke banyak fungsi matematika matriks Anda. Dua perubahan terpenting yang harus dilakukan adalah:
- Balik urutan simpul segitiga sehingga Direct3D melintasinya searah jarum jam dari depan. Misalnya, jika simpul Anda diindeks sebagai 0, 1, dan 2 di alur OpenGL Anda, teruskan ke Direct3D sebagai 0, 2, 1 sebagai gantinya.
- Gunakan matriks tampilan untuk menskalakan ruang dunia sebesar -1,0f ke arah z, secara efektif mengembalikan koordinat sumbu z. Untuk melakukan ini, balikkan tanda nilai pada posisi M31, M32, dan M33 dalam matriks tampilan Anda (saat memindahkannya ke jenis Matriks). Jika M34 bukan 0, balikkan tandanya juga.
Namun, Direct3D dapat mendukung sistem koordinat dengan tangan kanan. DirectXMath menyediakan sejumlah fungsi yang beroperasi di dan di seluruh sistem koordinat tangan kiri dan kanan. Mereka dapat digunakan untuk mempertahankan beberapa data jala asli dan pemrosesan matriks Anda. Meliputi:
Fungsi matriks DirectXMath | Deskripsi |
---|---|
XMMatrixLookAtLH | Membangun matriks tampilan untuk sistem koordinat sebelah kiri menggunakan posisi kamera, arah atas, dan titik fokus. |
XMMatrixLookAtRH | Membangun matriks tampilan untuk sistem koordinat dengan tangan kanan menggunakan posisi kamera, arah atas, dan titik fokus. |
XMMatrixLookToLH | Membangun matriks tampilan untuk sistem koordinat sebelah kiri menggunakan posisi kamera, arah atas, dan arah kamera. |
XMMatrixLookToRH | Membangun matriks tampilan untuk sistem koordinat dengan tangan kanan menggunakan posisi kamera, arah atas, dan arah kamera. |
XMMatrixOrthographicLH | Membangun matriks proyeksi ortogonal untuk sistem koordinat sebelah kiri. |
XMMatrixOrthographicOffCenterLH | Membangun matriks proyeksi ortogonal kustom untuk sistem koordinat tangan kiri. |
XMMatrixOrthographicOffCenterRH | Membangun matriks proyeksi ortogonal kustom untuk sistem koordinat dengan tangan kanan. |
XMMatrixOrthographicRH | Membangun matriks proyeksi ortogonal untuk sistem koordinat dengan tangan kanan. |
XMMatrixPerspectiveFovLH | Membangun matriks proyeksi perspektif sebelah kiri berdasarkan bidang tampilan. |
XMMatrixPerspectiveFovRH | Membangun matriks proyeksi perspektif tangan kanan berdasarkan bidang tampilan. |
XMMatrixPerspectiveLH | Membangun matriks proyeksi perspektif kidal. |
XMMatrixPerspectiveOffCenterLH | Membangun versi kustom dari matriks proyeksi perspektif sebelah kiri. |
XMMatrixPerspectiveOffCenterRH | Membangun versi kustom dari matriks proyeksi perspektif tangan kanan. |
XMMatrixPerspectiveRH | Membangun matriks proyeksi perspektif dengan tangan kanan. |
Pertanyaan umum porting OpenGL ES2.0-to-Direct3D 11
- Pertanyaan: "Secara umum, dapatkah saya mencari string atau pola tertentu dalam kode OpenGL saya dan menggantinya dengan setara Direct3D?"
- Jawaban: Tidak. OpenGL ES 2.0 dan Direct3D 11 berasal dari berbagai generasi pemodelan alur grafis. Meskipun ada beberapa kesamaan permukaan antara konsep dan API, seperti konteks penyajian dan instancing shader, Anda harus meninjau panduan ini serta referensi Direct3D 11 sehingga Anda dapat membuat pilihan terbaik saat membuat ulang alur Anda alih-alih mencoba pemetaan 1-ke-1. Namun, jika Anda melakukan porting dari GLSL ke HLSL, membuat serangkaian alias umum untuk variabel GLSL, intrinsik, dan fungsi tidak hanya dapat mempermudah porting, itu memungkinkan Anda untuk mempertahankan hanya satu set file kode shader.