Direct3D 9 ke Direct3D 10 Pertimbangan (Direct3D 10)
Halaman berikut ini menyediakan kerangka dasar perbedaan utama antara Direct3D 9 dan Direct3D 10. Kerangka di bawah ini memberikan beberapa wawasan untuk membantu pengembang dengan pengalaman Direct3D 9 untuk menjelajahi dan berhubungan dengan Direct3D 10.
Meskipun info dalam topik ini membandingkan Direct3D 9 dengan Direct3D 10, karena Direct3D 11 dibangun pada peningkatan yang dilakukan di Direct3D 10 dan 10.1, Anda juga memerlukan info ini untuk bermigrasi dari Direct3D 9 ke Direct3D 11. Untuk informasi tentang berpindah di luar Direct3D 10 ke Direct3D 11, lihat Migrasi ke Direct3D 11.
- Gambaran Umum Perubahan Struktural Utama dalam Direct3D 10
- Abstraksi / Pemisahan Mesin
- Trik untuk Menyelesaikan Masalah Build Aplikasi dengan Cepat
- Mengendarai Direct3D 10 API
- Pembuatan Sumber Daya
- Tampilan
- Akses Sumber Daya Statis versus Dinamis
- Efek Direct3D 10
- HLSL tanpa Efek
- Kompilasi Shader
- Pembuatan Sumber Daya Shader
- Antarmuka Lapisan Refleksi Shader
- Input Assembler Layouts - Vertex Shader / Input Stream Linkage
- Dampak Penghapusan Kode Mati Shader
- Contoh Struktur Input Vertex Shader
- Pembuatan Objek Status
- Tekstur Porting
- Pemindahan Shader
- Perbedaan Direct3D 10 Tambahan yang Harus Diwaspadai
- Perbedaan Direct3D 10.1 Tambahan
- Topik terkait
Gambaran Umum Perubahan Struktural Utama dalam Direct3D 10
Proses penyajian menggunakan perangkat Direct3D 10 secara struktural mirip dengan Direct3D 9.
- Mengatur sumber aliran vertex
- Atur tata letak input di Direct3D 10 (atur deklarasi aliran vertex di Direct3D 9)
- Mendeklarasikan topologi primitif
- Mengatur tekstur
- Mengatur objek status
- Mengatur shader
- Draw
Panggilan Gambar mengikat operasi bersama-sama; urutan panggilan sebelum panggilan Draw segan-segan. Perbedaan utama dalam desain API Direct3D 10 adalah sebagai berikut:
- Penghapusan Fungsi Tetap
- Penghapusan bit CAPS - Set fitur dasar Direct3D 10 dijamin
- Manajemen yang lebih ketat: akses sumber daya, status perangkat, konstanta shader, tautan shader (input dan output ke shader) antar tahap
- Perubahan nama titik entri API mencerminkan penggunaan memori GPU virtual (Map() alih-alih Lock()).
- Lapisan debug dapat ditambahkan ke perangkat pada waktu pembuatan
- Topologi primitif sekarang menjadi status eksplisit (dipisahkan dari panggilan Gambar)
- Konstanta shader eksplisit sekarang disimpan dalam buffer konstanta
- Penulisan shader dilakukan sepenuhnya di HLSL. Pengkompilasi HLSL sekarang berada di Dll Direct3D 10 utama.
- Tahap baru yang dapat diprogram - shader geometri
- Penghapusan BeginScene()/EndScene()
- Fungsionalitas umum 2D, fokus, dan manajemen adaptor yang diterapkan dalam komponen baru: DXGI
Penghapusan Fungsi Tetap
Terkadang mengejutkan bahwa bahkan di mesin Direct3D 9 yang sepenuhnya mengeksploitasi alur yang dapat diprogram, tetap ada sejumlah area yang bergantung pada alur fungsi tetap (FF). Area yang paling umum biasanya terkait dengan penyajian yang selaras dengan ruang layar untuk UI. Karena alasan inilah Anda mungkin perlu membangun shader emulasi FF atau set shader yang menyediakan perilaku pengganti yang diperlukan.
Dokumentasi ini berisi laporan resmi yang berisi sumber shader pengganti untuk perilaku FF yang paling umum (lihat Sampel EMU Fungsi Tetap). Beberapa perilaku piksel fungsi tetap termasuk pengujian alfa telah dipindahkan ke shader.
Validasi Waktu Pembuatan Objek Perangkat
Alur Direct3D 10 telah dirancang ulang dari bawah ke atas di perangkat keras dan perangkat lunak dengan niat utama untuk mengurangi overhead CPU (pada waktu Draw). Untuk mengurangi biaya, semua jenis data perangkat telah diberi objek dengan metode pembuatan eksplisit yang disediakan oleh perangkat itu sendiri. Ini memungkinkan validasi data yang ketat pada waktu pembuatan objek alih-alih selama panggilan Gambar seperti yang sering dilakukan dengan Direct3D 9.
Abstraksi / Pemisahan Mesin
Aplikasi, termasuk Game, yang ingin mendukung Direct3D 9 dan Direct3D 10 harus memiliki lapisan penyajian yang diabstraksi dari sisa basis kode. Ada banyak cara untuk mencapai ini tetapi kunci untuk semuanya adalah desain lapisan abstraksi untuk perangkat Direct3D tingkat bawah. Semua sistem harus berkomunikasi dengan perangkat keras melalui lapisan umum yang dirancang untuk menyediakan sumber daya GPU dan manajemen jenis tingkat rendah.
Penghapusan Langsung Dependensi Direct3D 9
Saat porting besar, basis kode yang diuji sebelumnya, penting untuk meminimalkan jumlah perubahan kode pada yang benar-benar diperlukan untuk mempertahankan perilaku yang diuji sebelumnya dalam kode. Praktik terbaik termasuk mendokumentasikan dengan jelas di mana item berubah menggunakan komentar. Seringkali berguna untuk memiliki standar komentar untuk pekerjaan ini yang memungkinkan navigasi cepat melalui basis kode.
Berikut ini adalah contoh daftar komentar blok baris tunggal/mulai standar yang dapat digunakan untuk pekerjaan ini.
Item | Deskripsi |
---|---|
Direct3D 10 DIHAPUS |
Gunakan ini di mana baris/ blok kode dihapus |
Pembaruan KEBUTUHAN Direct3D 10 |
Ini membantu menambahkan catatan tambahan ke komentar NEED UPDATE yang menunjukkan pekerjaan / API baru apa yang harus digunakan untuk kunjungan nanti ke kode untuk konversi perilaku. Penggunaan yang berat dari assert(false) juga harus digunakan di mana \\ Direct3D 10 NEEDS UPDATE terjadi untuk memastikan Anda tidak secara tidak sadar menjalankan kode yang salah |
Direct3D 10 DIUBAH |
Area di mana perubahan besar telah terjadi harus disimpan untuk referensi di masa mendatang tetapi dikomentari |
Direct3D 10 END |
Kualifikasi blok kode akhir |
Untuk beberapa baris sumber, Anda harus menggunakan gaya C /* */ komentar juga tetapi menambahkan komentar mulai/akhir yang relevan di sekitar area ini.
Trik untuk Menyelesaikan Masalah Build Aplikasi dengan Cepat
Mengesampingkan Tipe Direct3D 9
Mungkin berguna untuk menyisipkan file header tingkat tinggi yang berisi definisi /penimpaan jenis untuk jenis dasar Direct3D 9 yang tidak lagi didukung oleh header Direct3D 10. Ini akan membantu Anda meminimalkan jumlah perubahan dalam kode dan antarmuka di mana ada pemetaan langsung dari jenis Direct3D 9 ke jenis Direct3D 10 yang baru ditentukan. Pendekatan ini juga berguna untuk menjaga perilaku kode bersama-sama dalam satu file sumber. Dalam hal ini, ada baiknya untuk menentukan jenis versi netral / umumnya bernama yang menggambarkan konstruksi umum yang digunakan untuk penyajian namun mencakup API Direct3D 9 dan Direct3D 10. Misalnya:
#if defined(D3D9)
typedef IDirect3DIndexBuffer9 IDirect3DIndexBuffer;
typedef IDirect3DVertexBuffer9 IDirect3DVertexBuffer;
#else //D3D10
typedef ID3D10Buffer IDirect3DIndexBuffer;
typedef ID3D10Buffer IDirect3DVertexBuffer
#endif
Contoh spesifik Direct3D 10 lainnya dari ini meliputi:
typedef ID3D10TextureCube IDirect3DCubeTexture;
typedef ID3D10Texture3D IDirect3DVolumeTexture;
typedef D3D10_VIEWPORT D3DVIEWPORT;
typedef ID3D10VertexShader IDirect3DVertexShader;
typedef ID3D10PixelShader IDirect3DPixelShader;
Mengatasi Masalah Tautan
Dianjurkan untuk mengembangkan aplikasi Direct3D 10 dan Windows Vista menggunakan versi terbaru Microsoft Visual Studio. Namun, dimungkinkan untuk membangun aplikasi Windows Vista yang bergantung pada Direct3D 10 menggunakan Visual Studio versi 2003 sebelumnya. Direct3D 10 adalah komponen platform Windows Vista yang memiliki dependensi (seperti halnya SDK platform Server 2003 SP1) pada lib berikut: BufferOverflowU.lib diperlukan untuk menyelesaikan masalah buffer_security periksa linker.
Mensimulasikan CAP Perangkat
Banyak aplikasi berisi area kode yang bergantung pada data CAPS perangkat yang tersedia. Atasi ini dengan menimpa enumerasi perangkat dan memaksa CAPS perangkat ke nilai yang masuk akal. Rencanakan untuk mengunjungi kembali area di mana ada dependensi pada CAPS nanti untuk penghapusan penuh CAPS jika memungkinkan.
Mengendarai Direct3D 10 API
Bagian ini berfokus pada perubahan perilaku yang disebabkan oleh API Direct3D 10.
- Pembuatan Sumber Daya
- Tampilan
- Akses Sumber Daya Statis versus Dinamis
- Efek Direct3D 10
- HLSL tanpa Efek
- Kompilasi Shader
- Pembuatan Sumber Daya Shader
- Antarmuka Lapisan Refleksi Shader
- Input Assembler Layouts - Vertex Shader / Input Stream Linkage
- Dampak Penghapusan Kode Mati Shader
- Contoh Struktur Input Vertex Shader
- Pembuatan Objek Status
Pembuatan Sumber Daya
API Direct3D 10 telah merancang sumber daya sebagai jenis buffer generik yang memiliki bendera ikatan tertentu sesuai dengan penggunaan yang direncanakan. Titik desain ini dipilih untuk memfasilitasi akses sumber daya di alur untuk skenario seperti penyajian ke buffer vertex kemudian langsung menggambar hasilnya tanpa mengganggu CPU. Contoh berikut menunjukkan alokasi buffer vertex dan buffer indeks di mana Anda dapat melihat bahwa deskripsi sumber daya hanya berbeda dengan bendera pengikatan sumber daya GPU.
API Direct3D 10 telah menyediakan metode pembantu tekstur untuk secara eksplisit membuat sumber daya jenis tekstur tetapi seperti yang dapat Anda bayangkan, ini benar-benar fungsi pembantu.
- CreateTexture2D()
- CreateTextureCube()
- CreateTexture3D()
Saat menargetkan Direct3D 10, Anda mungkin ingin mengalokasikan lebih banyak item selama waktu pembuatan sumber daya daripada yang biasa Anda gunakan dengan Direct3D 9. Ini akan menjadi paling jelas dengan pembuatan buffer Target Render dan Tekstur di mana Anda perlu juga membuat tampilan untuk mengakses buffer dan mengatur sumber daya pada perangkat.
Tutorial 1: Dasar-Dasar Direct3D 10
Catatan
Direct3D 10 dan versi Direct3D yang lebih baru memperluas format file DDS untuk mendukung format DXGI baru, array tekstur, dan array peta kubus. Untuk informasi selengkapnya tentang ekstensi format file DDS, lihat Panduan Pemrograman untuk DDS.
Tampilan
Tampilan adalah antarmuka yang diketik secara khusus ke data yang disimpan dalam buffer piksel. Sumber daya dapat memiliki beberapa tampilan yang dialokasikan di dalamnya sekaligus dan fitur ini disorot dalam sampel Single Pass Render ke Cubemap yang terkandung dalam SDK ini.
Halaman Panduan Programmer di Akses Sumber Daya
Akses Sumber Daya Statis versus Dinamis
Untuk performa terbaik, aplikasi harus mempartisi penggunaan data mereka dalam hal sifat data statis vs dinamis. Direct3D 10 telah dirancang untuk memanfaatkan pendekatan ini dan dengan demikian, aturan akses untuk sumber daya telah diperketat secara signifikan melalui Direct3D 9. Untuk sumber daya statis, idealnya Anda harus mengisi sumber daya dengan datanya selama waktu pembuatan. Jika mesin Anda telah dirancang di sekitar Titik desain Buat, Kunci, Isi, Buka kunci titik desain Direct3D 9, Anda dapat menumpuk populasi dari Waktu pembuatan dengan menggunakan sumber daya penahapan dan metode UpdateSubResource pada antarmuka sumber daya.
Efek Direct3D 10
Penggunaan sistem Efek Direct3D 10 berada di luar lingkup artikel ini. Sistem ini telah ditulis untuk mengambil keuntungan penuh dari manfaat arsitektur yang disediakan Direct3D 10. Lihat bagian Efek (Direct3D 10) untuk detail selengkapnya tentang penggunaannya.
HLSL tanpa Efek
Alur Direct3D 10 Shader dapat didorong tanpa menggunakan sistem Efek Direct3D 10. Perhatikan bahwa dalam hal ini, semua buffer konstan, shader, sampler, dan pengikatan tekstur harus dikelola oleh aplikasi itu sendiri. Lihat tautan sampel dan bagian berikut dari dokumen ini untuk detail selengkapnya:
Kompilasi Shader
Pengkompilasi Direct3D 10 HLSL menghadirkan peningkatan pada definisi bahasa HLSL dan karenanya memiliki kemampuan untuk beroperasi dalam 2 mode. Untuk dukungan lengkap fungsi intrinsik gaya Direct3D 9 dan semantik, kompilasi harus dipanggil menggunakan bendera MODE KOMPATIBILITAS yang dapat ditentukan berdasarkan per kompilasi.
Semantik bahasa HLSL khusus model shader 4.0 dan fungsi intrinsik untuk Direct3D 10 dapat ditemukan di HLSL. Perubahan besar dalam sintaksis dari Direct3D 9 HLSL untuk paling diperhatikan adalah di area akses tekstur. Sintaks baru adalah satu-satunya bentuk yang didukung oleh pengkompilasi di luar mode kompatibilitas.
Catatan
API tipe kompilator Direct3D 10 (D3D10CompileShader dan D3D10CompileEffectFromMemory) disediakan oleh runtime Direct3D 10, 10.1, dan 11 yang berjalan di Windows Vista dan yang lebih baru. API jenis kompilator Direct3D 10 memiliki fungsionalitas yang sama dengan kompilator HLSL yang dikirim di DirectX SDK (Desember 2006). Pengkompilasi HLSL ini tidak mendukung profil Direct3D 10.1 (vs_4_1, ps_4_1, gs_4_1, fx_4_1), dan kehilangan sejumlah pengoptimalan dan peningkatan. Anda bisa mendapatkan kompilator HLSL yang mendukung profil Direct3D 10.1 dari rilis DirectX SDK warisan terbaru. Untuk informasi tentang DirectX SDK warisan, lihat Di mana DirectX SDK?. Anda bisa mendapatkan pengkompilasi baris perintah HLSL Fxc.exe terbaru dan API D3DCompiler dari Windows SDK.
Pembuatan Sumber Daya Shader
Pembuatan instans shader yang dikompilasi di luar sistem Efek Direct3D 10 dilakukan dengan cara yang sangat mirip dengan Direct3D 9 namun, dalam Direct3D 10, penting untuk menjaga tanda tangan Shader Input untuk digunakan nanti. Tanda tangan dikembalikan secara default sebagai bagian dari blob shader tetapi dapat diekstraksi untuk mengurangi persyaratan memori jika diperlukan. Untuk detail selengkapnya, lihat Menggunakan Shader di Direct3D 10.
Antarmuka Lapisan Refleksi Shader
Lapisan pantulan shader adalah antarmuka tempat informasi tentang persyaratan shader dapat diperoleh. Ini sangat berguna saat membuat tautan Rakitan Input (lihat di bawah) di mana Anda mungkin perlu melintasi persyaratan input shader untuk memastikan Anda menyediakan struktur input yang benar ke shader. Anda dapat membuat instans antarmuka lapisan pantulan pada saat yang sama seperti membuat instans shader yang dikompilasi.
Lapisan pantulan shader menggantikan metode D3DX9 yang menyediakan fungsionalitas serupa. Misalnya IsParameterUsed digantikan oleh metode GetDesc.
Input Assembler Layouts - Vertex Shader / Input Stream Linkage
Input Assembler (IA) menggantikan Gaya Direct3D 9 Vertex Stream Declaration dan struktur deskripsinya sangat mirip dalam bentuk. Perbedaan utama yang dibawa IA adalah bahwa objek tata letak IA yang dibuat harus langsung memetakan ke format tanda tangan input shader tertentu. Objek pemetaan yang dibuat untuk menautkan aliran input ke shader dapat digunakan di sejumlah shader di mana tanda tangan input shader cocok dengan shader yang digunakan untuk membuat Tata Letak Input.
Untuk mendorong alur dengan data statis, Anda harus mempertimbangkan permutasi format aliran input ke kemungkinan tanda tangan input shader dan membuat instans objek tata letak IA sedini mungkin dan menggunakannya kembali jika memungkinkan.
Dampak Penghapusan Kode Mati Shader
Bagian berikut merinci perbedaan signifikan antara Direct3D 9 dan Direct3D 10 yang kemungkinan memerlukan penanganan yang cermat dalam kode mesin Anda. Shader yang berisi ekspresi bersyarat sering kali memiliki jalur kode tertentu yang dihapus sebagai bagian dari proses kompilasi. Di Direct3D 9, dua jenis input dapat dihapus (ditandai untuk dihapus) ketika tidak digunakan: input tanda tangan (seperti contoh di bawah) dan input konstanta. Jika akhir buffer konstanta berisi entri yang tidak digunakan, deklarasi ukuran dalam shader akan mencerminkan ukuran buffer konstan tanpa entri yang tidak digunakan di akhir. Kedua jenis input ini tetap dalam tanda tangan atau buffer konstan Direct3D 10 dengan pengecualian khusus dalam kasus input konstanta yang tidak digunakan di akhir buffer konstanta. Ini mungkin berdampak pada mesin saat menangani shader besar dan membuat tata letak input. Elemen yang dihapus oleh pengoptimalan kode mati dalam kompilator masih harus dideklarasikan dalam struktur input. Contoh berikut menunjukkan hal berikut:
Contoh Struktur Input Vertex Shader
struct VS_INPUT
{
float4 pos: SV_Position;
float2 uv1 : Texcoord1;
float2 uv2 : Texcoord2; *
};
* Penghapusan kode mati Direct3D 9 akan menghapus deklarasi di shader karena penghapusan kode mati bersyarat
float4x4 g_WorldViewProjMtx;
static const bool g_bLightMapped = false; // define a compile time constant
VS_INPUT main(VS_INPUT i)
{
VS_INPUT o;
o.pos = mul( i.pos, g_WorldViewProjMtx);
o.uv1 = i.uv1;
if ( g_bLightMapped )
{
o.uv2 = i.uv2;
}
return o;
}
Atau, Anda bisa membuatnya lebih jelas bahwa konstanta adalah konstanta waktu kompilasi dengan deklarasi berikut:
#define LIGHT_MAPPED false
Dalam contoh di atas, di bawah Direct3D 9, elemen uv2 akan dihapus karena pengoptimalan kode mati di pengkompilasi. Di bawah Direct3D 10, kode mati masih akan dihapus tetapi tata letak perakitan input shader mengharuskan definisi data input ada. Lapisan refleksi shader menyediakan sarana untuk menangani situasi ini secara generik di mana Anda dapat melintasi persyaratan input shader dan memastikan bahwa Anda memberikan deskripsi lengkap Tentang Aliran Input untuk pemetaan tanda tangan shader.
Berikut adalah contoh fungsi untuk mendeteksi keberadaan nama/indeks semantik dalam tanda tangan fungsi:
// Returns true if the SemanticName / SemanticIndex is used in the input signature.
// pReflector is a previously acquired shader reflection interface.
bool IsSignatureElementExpected(ID3D10ShaderReflection *pReflector, const LPCSTR SemanticName, UINT SemanticIndex)
{
D3D10_SHADER_DESC shaderDesc;
D3D10_SIGNATURE_PARAMETER_DESC paramDesc;
Assert(pReflector);
Assert(SemanticName);
pReflector->GetDesc(&shaderDesc);
for (UINT k=0; k<shaderDesc.InputParameters; k++)
{
pReflector->GetInputParameterDesc( k, ¶mDesc);
if (wcscmp( SemanticName, paramDesc.SemanticName)==0 && paramDesc.SemanticIndex == SemanticIndex)
return true;
}
return false;
}
Pembuatan Objek Status
Saat porting kode mesin, ini dapat membantu untuk awalnya menggunakan sekumpulan objek status default dan menonaktifkan semua pengaturan status render /status tekstur perangkat Direct3D 9. Ini akan menyebabkan artefak penyajian tetapi merupakan cara tercepat untuk menyiapkan dan menjalankannya. Anda nantinya dapat membuat sistem manajemen objek status yang dapat menggunakan kunci majemuk untuk mengaktifkan penggunaan kembali maksimum jumlah objek status yang digunakan.
Tekstur Porting
Format File Didukung
Fungsi D3DXxxCreateXXX dan D3DXxxSaveXXX yang membuat atau menyimpan tekstur dari atau ke file grafis (misalnya, D3DX10CreateTextureFromFile) mendukung serangkaian format file yang berbeda dalam Direct3D 10 daripada yang mereka lakukan di Direct3D 9:
Format File | Direct3D 9 | Direct3D 10 |
---|---|---|
.bmp | x | x |
.jpg | x | x |
.tga | x | |
.png | x | x |
.dds | x | x |
.Ppm | x | |
.Dib | x | |
.Hdr | x | |
.pfm | x | |
.tiff | x | |
.gif | x | |
.tif | x |
Untuk detailnya, bandingkan enumerasi Direct3D 9 D3DXIMAGE_FILEFORMAT dengan enumerasi D3DX10_IMAGE_FILE_FORMAT untuk Direct3D 10.
Catatan
Pustaka utilitas D3DX (D3DX 9, D3DX 10, dan D3DX 11) tidak digunakan lagi untuk Windows 8. Untuk pemrosesan file tekstur, kami sarankan Anda menggunakan DirectXTex.
Memetakan Format Tekstur
Tabel berikut ini memperlihatkan pemetaan format tekstur dari Direct3D 9 ke Direct3D 10. Konten apa pun dalam format yang tidak tersedia di DXGI perlu dikonversi oleh rutinitas utilitas.
Direct3D 9 Format | Direct3D 10 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 D3D9. |
D3DFMT_A8L8 | DXGI_FORMAT_R8G8_UNORM Catatan: Gunakan swizzle .rrrg di shader untuk menduplikasi merah dan memindahkan hijau ke komponen alfa untuk mendapatkan perilaku D3D9. |
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 (dalam DX9 data ditingkatkan skalanya sebesar 255,0f, tetapi ini dapat ditangani dalam kode shader). |
D3DFMT_YUY2 | Tidak tersedia |
D3DFMT_G8R8_G8B8 | DXGI_FORMAT_R8G8_B8G8_UNORM (di DX9, data ditingkatkan skalanya sebesar 255,0f, tetapi ini dapat ditangani dalam kode 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... hanya perbedaan adalah 'alfa yang telah diubah sebelumnya', 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... hanya perbedaan adalah 'alfa yang telah diubah sebelumnya', 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 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 dalam 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 dalam 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 |
FourCC 'ATI2' | DXGI_FORMAT_BC5_UNORM |
¹DXGI 1.1, yang disertakan dalam runtime Direct3D 11, mencakup format BGRA. Namun, dukungan untuk format ini bersifat opsional untuk perangkat Direct3D 10 dan 10.1 dengan driver yang diterapkan ke Windows Display Driver Model (WDDM) untuk Windows Vista (WDDM 1.0). Pertimbangkan untuk menggunakan DXGI_FORMAT_R8G8B8A8_UNORM sebagai gantinya. Atau, Anda dapat membuat perangkat dengan D3D10_CREATE_DEVICE_BGRA_SUPPORT untuk memastikan bahwa Anda hanya mendukung komputer dengan runtime Direct3D 11.0 dan driver WDDM 1.1 atau yang lebih tinggi terinstal.
Format ²DXGI 1.0 ditentukan 5:6:5 dan 5:5:5:1, tetapi tidak didukung oleh runtime Direct3D 10.x atau Direct3D 11.0. Format ini secara opsional didukung dengan DXGI 1.2 dalam runtime DirectX 11.1, yang diperlukan untuk adaptor video tingkat fitur 11.1 dan driver WDDM 1.2 (model driver tampilan dimulai dengan Windows 8) dan sudah didukung pada tingkat fitur 10level9.
³DXGI 1.2 memperkenalkan format 4:4:4:4. Format ini secara opsional didukung dalam runtime DirectX 11.1, yang diperlukan untuk adaptor video tingkat fitur 11.1 dan driver WDDM 1.2 dan sudah didukung pada tingkat fitur 10level9.
Untuk format yang tidak dikompresi, DXGI telah membatasi dukungan untuk pola format piksel arbitrer; semua format yang tidak dikompresi harus berjenis RGBA. Ini mungkin memerlukan penyimpangan format piksel aset yang ada, yang kami sarankan Anda komputasi sebagai pass pra-proses offline jika memungkinkan.
Pemindahan Shader
Shader Direct3D 10 Ditulis dalam HLSL
Direct3D 10 membatasi penggunaan bahasa perakitan hanya untuk tujuan debugging, oleh karena itu setiap shader rakitan tulisan tangan yang digunakan dalam Direct3D 9 perlu dikonversi ke HLSL.
Tanda Tangan dan Linkage Shader
Kami membahas persyaratan untuk tautan Rakitan Input ke tanda tangan input shader Vertex sebelumnya dalam dokumen ini (lihat di atas). Perhatikan bahwa runtime Direct3D 10 juga telah memperketat persyaratan untuk tahap untuk mentahapkan tautan antar shader. Perubahan ini akan memengaruhi sumber shader di mana pengikatan antar tahap mungkin belum sepenuhnya dijelaskan di bawah Direct3D 9. Misalnya:
VS_OUTPUT PS_INPUT
float4 pos : SV_POSITION; float4 pos : SV_POSITION;
float4 uv1 : TEXCOORD1; float4 uv1 : TEXCOORD1;
float4x3 tangentSp : TEXCOORD2; float4 tangent : TEXCOORD2; *
float4 Color : TEXCOORD6; float4 color : TEXCOORD6;
* Rusak VS - PS Linkage - meskipun shader piksel mungkin tidak tertarik dengan matriks lengkap, linkage harus menentukan float4x3 lengkap.
Perhatikan, semantik tautan antar tahap harus cocok persis namun, input tahap target mungkin merupakan awalan dari nilai yang dihasilkan. Dalam contoh di atas, shader piksel dapat memiliki posisi dan texcoord1 sebagai satu-satunya input, tetapi tidak dapat memiliki posisi dan texcoord2 sebagai satu-satunya input karena batasan pengurutan.
Tautan Tahap Shader HLSL
Tautan antar shader dapat terjadi di salah satu titik berikut dalam alur:
- Input Assembler ke Vertex Shader
- Vertex Shader ke Pixel Shader
- Vertex Shader ke Geometry Shader
- Vertex Shader untuk Aliran Output
- Geometri Shader ke Pixel Shader
- Geometri Shader untuk Streaming Keluar
Buffer Konstanta
Untuk kemudahan porting konten dari Direct3D 9 pendekatan awal untuk manajemen konstan di luar sistem Efek mungkin melibatkan pembuatan buffer konstanta tunggal yang berisi semua konstanta yang diperlukan. Penting bagi performa untuk memesan konstanta ke dalam buffer dengan frekuensi pembaruan yang diharapkan. Organisasi ini akan mengurangi jumlah set konstanta redundan menjadi minimum.
Bidang klip pengguna di HLSL pada tingkat fitur 9 dan yang lebih tinggi
Dimulai dengan Windows 8, Anda dapat menggunakan atribut fungsi clipplanes dalam deklarasi fungsi HLSL daripada SV_ClipDistance untuk membuat shader Anda berfungsi pada tingkat fitur 9_x serta tingkat fitur 10 dan yang lebih tinggi. Untuk informasi selengkapnya, lihat Bidang klip pengguna pada perangkat keras tingkat fitur 9.
Perbedaan Direct3D 10 Tambahan yang Harus Diwaspadai
Bilangan bulat sebagai Input
Di Direct3D 9, tidak ada dukungan perangkat keras nyata untuk jenis data bilangan bulat, namun perangkat keras Direct3D 10 mendukung jenis bilangan bulat eksplisit. Jika Anda memiliki data floating-point di buffer vertex Anda, maka Anda harus memiliki input float. Jika tidak, jenis bilangan bulat akan menjadi representasi pola bit dari nilai floating-point. Jenis bilangan bulat tidak diperbolehkan untuk input shader piksel kecuali nilai ditandai tanpa interpolasi (lihat Pengubah Interpolasi).
Kursor Mouse
Pada versi Windows sebelumnya, rutinitas kursor mouse GDI standar tidak beroperasi dengan benar pada semua perangkat eksklusif layar penuh. API SetCursorProperties, ShowCursor, dan SetCursorPosition ditambahkan untuk menangani kasus ini. Karena versi GDI Windows Vista sepenuhnya memahami permukaan DXGI , tidak perlu API kursor mouse khusus ini sehingga tidak ada Direct3D 10 yang setara. Aplikasi Direct3D 10 harus menggunakan rutinitas kursor mouse GDI standar untuk kursor mouse.
Memetakan Texel ke Piksel di Direct3D 10
Di Direct3D 9, pusat texel dan pusat piksel terpisah setengah unit (lihat Langsung Memetakan Texel ke Piksel (Direct3D 9)). Di Direct3D 10, pusat texel sudah berada di setengah unit, jadi tidak perlu menggeser koordinat verteks sama sekali.
Merender quad layar penuh lebih lurus ke depan dengan Direct3D 10. Quad layar penuh harus ditentukan dalam clipspace (-1,1) dan hanya melewati shader vertex tanpa perubahan. Dengan cara ini, Tidak perlu memuat ulang buffer vertex Anda setiap kali resolusi layar berubah, dan tidak ada pekerjaan tambahan di shader piksel untuk memanipulasi koordinat tekstur.
Perubahan Perilaku Penghitungan Referensi
Tidak seperti versi Direct3D sebelumnya, berbagai fungsi Set tidak akan menyimpan referensi ke objek perangkat. Ini berarti bahwa aplikasi harus memastikan bahwa aplikasi menyimpan referensi pada objek selama objek tersebut ingin objek tersebut terikat ke alur. Ketika jumlah ref objek turun ke nol, maka objek akan tidak terikat dari alur saat dihancurkan. Gaya penahanan referensi ini juga dikenal sebagai penahanan referensi lemah, jadi oleh karena itu setiap lokasi ikatan pada objek Perangkat menyimpan referensi lemah ke antarmuka/ objek. Kecuali disebutkan secara eksplisit sebaliknya, perilaku ini harus diasumsikan untuk semua metode Set. Setiap kali penghancuran objek menyebabkan titik ikat diatur ke NULL keluar, Lapisan Debug akan mengeluarkan peringatan. Catatan, panggilan ke perangkat Dapatkan metode seperti OMGetRenderTargets akan meningkatkan jumlah referensi objek yang dikembalikan.
Uji Tingkat Koperasi
Fungsionalitas Api Direct3D 9 TestCooperativeLevel dianalogikan untuk mengatur DXGI_PRESENT_TEST saat memanggil Ada.
StretchRect
Fungsi yang mirip dengan metode Direct3D 9 IDirect3DDevice9::StretchRect tidak tersedia di Direct3D 10 dan 10.1. Untuk menyalin permukaan sumber daya, gunakan ID3D10Device::CopySubresourceRegion. Untuk mengubah ukuran operasi, render ke tekstur dengan menggunakan pemfilteran tekstur. Untuk mengonversi permukaan MSAA ke permukaan non-MSAA, gunakan ID3D10Device::ResolveSubresource.
Perbedaan Direct3D 10.1 Tambahan
Windows Vista dengan Paket Layanan 1 (SP1) menyertakan pembaruan kecil ke Direct3D 10 dan Direct3D 10.1, yang mengekspos fitur perangkat keras tambahan berikut:
- Shader per sampel MSAA
- Read-back kedalaman MSAA
- Mode campuran independen per target render
- Array peta kubus
- Render ke format block-compressed (BC)
Pembaruan Direct3D 10.1 menambahkan dukungan untuk antarmuka baru berikut, yang berasal dari antarmuka yang ada:
Pembaruan Direct3D 10.1 juga menyertakan struktur tambahan berikut:
API Direct3D 10.1 menyertakan konsep baru bernama tingkat fitur. Konsep ini berarti Anda dapat menggunakan API Direct3D 10.1 untuk mendorong perangkat keras Direct3D 10.0 (D3D10_FEATURE_LEVEL_10_0) atau Direct3D 10.1 (D3D10_FEATURE_LEVEL_10_1). Karena API Direct3D 10.1 berasal dari antarmuka Direct3D 10, aplikasi dapat membuat perangkat Direct3D 10.1, lalu menggunakannya sebagai perangkat Direct3D 10.0 kecuali di mana fitur khusus 10.1 baru diperlukan (asalkan tingkat fitur D3D10_FEATURE_LEVEL_10_1 hadir dan mendukung fitur ini).
Catatan
Perangkat Direct3D 10.1 dapat menggunakan profil shader HLSL 10.0 yang ada (vs_4_0, ps_4_0, gs_4_0) dan profil 10.1 baru (vs_4_1, ps_4_1, gs_4_1) dengan instruksi dan kemampuan HLSL tambahan.
Windows 7 berisi pembaruan kecil ke API Direct3D 10.1 yang disertakan dalam runtime Direct3D 11. Pembaruan ini menambahkan dukungan untuk tingkat fitur berikut:
Windows 7 juga menambahkan dukungan ke Direct3D 10.1 untuk Windows Advanced Rasterization Platform (WARP). Anda dapat menentukan driver WARP dengan menggunakan D3D10_DRIVER_TYPE_WARP.
Untuk informasi selengkapnya tentang Direct3D 10.1, lihat Fitur Direct3D 10.1 dan enumerasi D3D10_FEATURE_LEVEL1.
Topik terkait