Bagikan melalui


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

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;

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

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

Sampel CubeMap

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:

Sampel HLSL tanpa Efek

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, &paramDesc);
        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.

Panduan Pemrograman untuk Direct3D 10