Bagikan melalui


Rencanakan port Anda dari OpenGL ES 2.0 ke Direct3D

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:

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.