Mengonfigurasi Fungsionalitas Blending
Operasi blending dilakukan pada setiap output shader piksel (nilai RGBA) sebelum nilai output ditulis ke target render. Jika multisampling diaktifkan, penpaduan dilakukan pada setiap multisample; jika tidak, penpaduan dilakukan pada setiap piksel.
Membuat Status Campuran
Status campuran adalah kumpulan status yang digunakan untuk mengontrol perpaduan. Status ini (ditentukan dalam D3D11_BLEND_DESC1) digunakan untuk membuat objek status campuran dengan memanggil ID3D11Device1::CreateBlendState1.
Misalnya, berikut adalah contoh pembuatan blend-state yang sangat sederhana yang menonaktifkan penpaduan alfa dan tidak menggunakan masking piksel per komponen.
ID3D11BlendState1* g_pBlendStateNoBlend = NULL;
D3D11_BLEND_DESC1 BlendState;
ZeroMemory(&BlendState, sizeof(D3D11_BLEND_DESC1));
BlendState.RenderTarget[0].BlendEnable = FALSE;
BlendState.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
pd3dDevice->CreateBlendState1(&BlendState, &g_pBlendStateNoBlend);
Contoh ini mirip dengan Sampel HLSLWithoutFX10.
Mengikat Status Campuran
Setelah Anda membuat objek blend-state, ikat objek blend-state ke tahap output-merger dengan memanggil ID3D11DeviceContext::OMSetBlendState.
float blendFactor[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
UINT sampleMask = 0xffffffff;
pd3dDevice->OMSetBlendState(g_pBlendStateNoBlend, blendFactor, sampleMask);
API ini mengambil tiga parameter: objek blend-state, faktor campuran empat komponen, dan masker sampel. Anda dapat meneruskan NULL untuk objek blend-state untuk menentukan status blend default atau meneruskan objek blend-state. Jika Anda membuat objek status campuran dengan D3D11_BLEND_BLEND_FACTOR atau D3D11_BLEND_INV_BLEND_FACTOR, Anda dapat meneruskan faktor campuran untuk memodulasi nilai untuk shader piksel, merender target, atau keduanya. Jika Anda tidak membuat objek blend-state dengan D3D11_BLEND_BLEND_FACTOR atau D3D11_BLEND_INV_BLEND_FACTOR, Anda masih dapat melewati faktor campuran non-NULL, tetapi tahap blending tidak menggunakan faktor campuran; runtime menyimpan faktor campuran, dan Anda nantinya dapat memanggil ID3D11DeviceContext::OMGetBlendState untuk mengambil faktor campuran. Jika Anda melewati NULL, runtime menggunakan atau menyimpan faktor campuran yang sama dengan { 1, 1, 1, 1 }. Masker sampel adalah masker yang ditentukan pengguna yang menentukan cara mengambil sampel target render yang ada sebelum memperbaruinya. Masker pengambilan sampel default adalah 0xffffffff yang menunjuk pengambilan sampel titik.
Dalam skema buffering yang paling mendalam, piksel yang paling dekat dengan kamera adalah piksel yang digambar. Saat menyiapkan status stensil kedalaman, anggota DepthFuncdari D3D11_DEPTH_STENCIL_DESC dapat menjadi D3D11_COMPARISON_FUNC apa pun. Biasanya, Anda ingin DepthFuncD3D11_COMPARISON_LESS, sehingga piksel yang paling dekat dengan kamera akan menimpa piksel di belakangnya. Namun, tergantung pada kebutuhan aplikasi Anda, salah satu fungsi perbandingan lainnya dapat digunakan untuk melakukan pengujian kedalaman.
Topik Penpaduan Tingkat Lanjut
Alfa-ke-Cakupan
Alpha-to-coverage adalah teknik multisampling yang paling berguna untuk situasi seperti dedaunan padat di mana ada beberapa poligon tumpang tindih yang menggunakan transparansi alfa untuk menentukan tepi di dalam permukaan.
Anda dapat menggunakan anggota AlphaToCoverageEnable dari D3D11_BLEND_DESC1 atau D3D11_BLEND_DESC untuk beralih apakah runtime mengonversi komponen .a (alfa) register output SV_Target0 dari shader piksel ke masker cakupan n-langkah (mengingat RenderTarget n-sample). Runtime melakukan operasi AND dari masker ini dengan cakupan sampel khas untuk piksel di primitif (selain masker sampel) untuk menentukan sampel mana yang akan diperbarui di semua RenderTargetaktif.
Jika output shader piksel SV_Coverage, runtime menonaktifkan alfa-ke-cakupan.
Catatan
Dalam multisampling, runtime hanya berbagi satu cakupan untuk semua RenderTargets. Fakta bahwa runtime membaca dan mengonversi .a dari output SV_Target0 ke cakupan ketika AlphaToCoverageEnable adalah TRUE tidak mengubah nilai .a yang masuk ke blender di RenderTarget 0 (jika RenderTarget kebetulan diatur di sana). Secara umum, jika Anda mengaktifkan alfa-ke-cakupan, Anda tidak memengaruhi bagaimana semua output warna dari shader piksel berinteraksi dengan RenderTargets melalui tahap output-merger kecuali bahwa runtime melakukan operasi AND dari masker cakupan dengan masker alfa-ke-cakupan. Alfa-ke-cakupan bekerja secara independen untuk apakah runtime dapat memadukan RenderTarget atau apakah Anda menggunakan perpaduan pada RenderTarget.
Perangkat keras grafis tidak secara tepat menentukan persis bagaimana hal itu mengonversi shader piksel SV_Target0,a (alfa) ke masker cakupan, kecuali bahwa alfa 0 (atau kurang) harus memetakan tanpa cakupan dan alfa 1 (atau lebih besar) harus memetakan ke cakupan penuh (sebelum runtime melakukan operasi AND dengan cakupan primitif aktual). Ketika alfa berubah dari 0 ke 1, cakupan yang dihasilkan umumnya harus meningkat secara monoton. Namun, perangkat keras mungkin melakukan dithering area untuk memberikan beberapa kuantisasi nilai alfa yang lebih baik dengan biaya resolusi spasial dan kebisingan. Nilai alfa NaN (Bukan Angka) menghasilkan masker tanpa cakupan (nol).
Alfa-ke-cakupan juga secara tradisional digunakan untuk transparansi pintu layar atau mendefinisikan siluet terperinci untuk sprite buram.
Memadukan Output Pixel Shader
Fitur ini memungkinkan penggabungan output untuk menggunakan output shader piksel secara bersamaan sebagai sumber input ke operasi penpaduan dengan target render tunggal di slot 0.
Contoh ini mengambil dua hasil dan menggabungkannya dalam satu pass, memadukan satu ke tujuan dengan perkalian dan yang lainnya dengan add:
SrcBlend = D3D11_BLEND_ONE;
DestBlend = D3D11_BLEND_SRC1_COLOR;
Contoh ini mengonfigurasi output shader piksel pertama sebagai warna sumber dan output kedua sebagai faktor campuran komponen per warna.
SrcBlend = D3D11_BLEND_SRC1_COLOR;
DestBlend = D3D11_BLEND_INV_SRC1_COLOR;
Contoh ini menggambarkan bagaimana faktor campuran harus cocok dengan guncangan shader:
SrcFactor = D3D11_BLEND_SRC1_ALPHA;
DestFactor = D3D11_BLEND_SRC_COLOR;
OutputWriteMask[0] = .ra; // pseudocode for setting the mask at
// RenderTarget slot 0 to .ra
Bersama-sama, faktor campuran dan kode shader menyiratkan bahwa shader piksel diperlukan untuk menghasilkan setidaknya o0.r dan o1.a. Komponen output ekstra dapat dihasilkan oleh shader tetapi akan diabaikan, lebih sedikit komponen akan menghasilkan hasil yang tidak terdefinisi.
Topik terkait