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.
Alur ini memiliki tiga tahap shader dan masing-masing diprogram dengan shader HLSL. Semua shader Direct3D 10 ditulis dalam HLSL, yang menargetkan model shader 4.
Perbedaan antara Direct3D 9 dan Direct3D 10:
- Tidak seperti model shader Direct3D 9 yang dapat ditulis dalam bahasa perakitan menengah, shader model 4.0 shader hanya ditulis dalam HLSL. Kompilasi shader offline ke dalam bytecode yang dapat dikonsumsi perangkat masih didukung, dan direkomendasikan untuk sebagian besar skenario.
Contoh ini hanya menggunakan shader vertex. Karena semua shader dibangun dari inti shader umum, mempelajari cara menggunakan vertex shader sangat mirip dengan menggunakan shader geometri atau shader piksel.
Setelah Anda menulis shader HLSL (contoh ini menggunakan shader vertex HLSLWithoutFX.vsh), Anda harus menyiapkannya untuk tahap alur tertentu yang akan menggunakannya. Untuk melakukan ini, Anda perlu:
Langkah-langkah ini perlu diulang untuk setiap shader dalam pipeline.
Mengkompilasi Shader
Langkah pertama adalah mengkompilasi shader, untuk memeriksa apakah Anda telah mengkodekan pernyataan HLSL dengan benar. Ini dilakukan dengan memanggil D3D10CompileShader dan menyediakannya dengan beberapa parameter seperti yang ditunjukkan di sini:
IPD3D10Blob * pBlob;
// Compile the vertex shader from the file
D3D10CompileShader( strPath, strlen( strPath ), "HLSLWithoutFX.vsh",
NULL, NULL, "Ripple", "vs_4_0", dwShaderFlags, &pBlob, NULL );
Fungsi ini mengambil parameter berikut:
Nama file ( dan panjang string nama dalam byte ) yang berisi shader. Contoh ini hanya menggunakan shader vertex (dalam file file HLSLWithoutFX.vsh di mana ekstensi file .vsh adalah singkatan untuk shader vertex).
Nama dari fungsi shader. Contoh ini mengkompilasi shader vertex dari fungsi Ripple yang mengambil satu input dan mengembalikan struct output (fungsinya berasal dari sampel HLSLWithoutFX):
VS_OUTPUT Ripple( in float2 vPosition : POSITION )
Penunjuk ke semua makro yang digunakan oleh shader. Gunakan D3D10_SHADER_MACRO untuk membantu menentukan makro Anda; cukup buat string nama yang berisi semua nama makro (dengan setiap nama dipisahkan oleh spasi) dan string definisi (dengan setiap isi makro dipisahkan oleh spasi). Kedua string harus berakhir dengan NULL.
Penunjuk ke file lain yang perlu Anda sertakan untuk mengkompilasi shader Anda. Ini menggunakan antarmuka ID3D10Include yang memiliki dua metode yang diterapkan pengguna: Buka dan Tutup. Untuk membuat pekerjaan ini, Anda harus mengimplementasikan isi metode Buka dan Tutup; dalam metode Buka tambahkan kode yang akan Anda gunakan untuk membuka file termasuk apa pun yang Anda inginkan, dalam fungsi Tutup tambahkan kode untuk menutup file ketika Anda selesai dengannya.
Nama fungsi shader untuk dikompilasi. Shader ini mengkompilasi fungsi Ripple.
Profil shader yang dituju saat mengkompilasi. Karena Anda dapat mengkompilasi fungsi menjadi shader jenis vertex, geometri, atau piksel, profil memberitahukan pengkompilasi jenis shader mana dan model shader mana yang akan dibandingkan dengan kode.
Bendera pengkompilasi shader. Bendera ini memberi tahu pengkompilasi informasi apa yang akan dimasukkan ke dalam output yang dikompilasi dan bagaimana Anda ingin kode output dioptimalkan: untuk kecepatan, untuk debug, dll. Lihat Effect Constants (Direct3D 10) untuk daftar bendera yang tersedia. Sampel berisi beberapa kode yang dapat Anda gunakan untuk mengatur nilai bendera pengkompilasi untuk proyek Anda - ini terutama pertanyaan tentang apakah Anda ingin menghasilkan informasi debug atau tidak.
Penunjuk ke buffer yang berisi kode shader yang dikompilasi. Buffer juga berisi informasi debug yang tertanam dan informasi tabel simbol yang diminta oleh flag compiler.
Penunjuk ke buffer yang berisi daftar kesalahan dan peringatan yang ditemui selama kompilasi, yang merupakan pesan yang sama yang akan Anda lihat di output debug jika Anda menjalankan debugger saat mengkompilasi shader. null adalah nilai yang dapat diterima ketika Anda tidak ingin kesalahan dikembalikan ke buffer.
Jika shader berhasil dikompilasi, pointer ke kode shader dikembalikan sebagai antarmuka ID3D10Blob. Ini disebut antarmuka Blob karena pointer menunjuk ke lokasi dalam memori yang terdiri dari array DWORD. Antarmuka disediakan sehingga Anda bisa mendapatkan penunjuk ke shader yang dikompilasi yang akan Anda butuhkan di langkah berikutnya.
Dimulai dengan SDK Desember 2006, pengkompilasi DirectX 10 HLSL sekarang menjadi kompilator default di DirectX 9 dan DirectX 10. Lihat Effect-Compiler Alat untuk detailnya.
Mendapatkan Pointer ke Shader yang Dikompilasi
Beberapa metode API memerlukan penunjuk ke shader yang dikompilasi. Argumen ini biasanya disebut pShaderBytecode karena menunjuk ke shader yang dikompilasi yang diwakili sebagai urutan kode byte. Untuk mendapatkan penunjuk ke shader yang dikompilasi, pertama-tama kompilasi shader dengan memanggil D3D10CompileShader atau fungsi serupa. Jika kompilasi berhasil, shader yang dikompilasi dikembalikan dalam antarmukaID3D10Blob. Terakhir, gunakan metodeGetBufferPointeruntuk mengembalikan pointer.
Membuat Objek Shader
Setelah shader dikompilasi, panggil CreateVertexShader untuk membuat objek shader:
ID3D10VertexShader ** ppVertexShader
ID3D10Blob pBlob;
// Create the vertex shader
hr = pd3dDevice->CreateVertexShader( (DWORD*)pBlob->GetBufferPointer(),
pBlob->GetBufferSize(), &ppVertexShader );
// Release the pointer to the compiled shader once you are done with it
pBlob->Release();
Untuk membuat objek shader, teruskan penunjuk ke shader yang dikompilasi ke CreateVertexShader. Karena Anda harus berhasil mengkompilasi shader terlebih dahulu, panggilan ini hampir pasti akan berlalu, kecuali Anda memiliki masalah memori pada komputer Anda.
Anda dapat membuat objek shader sebanyak yang Anda suka dan hanya menyimpan pointer ke objek tersebut. Mekanisme ini berfungsi sama untuk geometri dan shader pixel dengan asumsi Anda mencocokkan profil shader (saat Anda memanggil metode kompilasi) ke nama antarmuka (saat Anda memanggil metode membuat).
Mengatur Objek Shader
Langkah terakhir adalah menyetel shader ke tahap pipa. Karena ada tiga tahap shader dalam alur, Anda harus melakukan tiga panggilan API, satu untuk setiap tahap.
// Set a vertex shader
pd3dDevice->VSSetShader( g_pVS10 );
Panggilan ke VSSetShader membawa penunjuk ke shader vertex yang dibuat di langkah 1. Ini mengatur shader di perangkat. Tahap shader vertex sekarang diinisialisasi dengan kode shader vertex-nya, sekarang tinggal menginisialisasi variabel shader yang diperlukan.
Ulangi untuk ketiga Tahap Shader
Ulangi serangkaian langkah yang sama ini untuk membangun vertex atau piksel shader atau bahkan shader geometri yang mengirimkan output ke shader piksel.