Teknik Buffer Stensil (Direct3D 9)

Aplikasi menggunakan buffer stensil untuk menutupi piksel dalam gambar. Masker mengontrol apakah piksel digambar atau tidak. Beberapa efek yang lebih umum ditunjukkan di bawah ini.

Buffer stensil memungkinkan atau menonaktifkan gambar ke permukaan target penyajian berdasarkan piksel demi piksel. Pada tingkat yang paling mendasar, ini memungkinkan aplikasi untuk menutupi bagian dari gambar yang dirender sehingga tidak ditampilkan. Aplikasi sering menggunakan buffer stensil untuk efek khusus seperti larut, menurun, dan menguraikan.

Informasi buffer stensil disematkan dalam data z-buffer. Aplikasi Anda dapat menggunakan metode IDirect3D9::CheckDeviceFormat untuk memeriksa dukungan stensil perangkat keras, seperti yang ditunjukkan dalam contoh kode berikut.

// Reject devices that cannot perform 8-bit stencil buffering. 
// The following example assumes that pCaps is a valid pointer 
// to an initialized D3DCAPS9 structure. 

if( FAILED( m_pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal,
                                       pCaps->DeviceType,  
                                       Format,  
                                       D3DUSAGE_DEPTHSTENCIL, 
                                       D3DRTYPE_SURFACE,
                                       D3DFMT_D24S8 ) ) )
return E_FAIL;

IDirect3D9::CheckDeviceFormat memungkinkan Anda memilih perangkat untuk dibuat berdasarkan kemampuan perangkat tersebut. Dalam hal ini, perangkat yang tidak mendukung buffer stensil 8-bit ditolak. Perhatikan bahwa ini hanya satu kemungkinan penggunaan untuk IDirect3D9::CheckDeviceFormat; untuk detailnya lihat Menentukan Dukungan Perangkat Keras (Direct3D 9).

Cara Kerja Buffer Stensil

Direct3D melakukan pengujian pada konten buffer stensil berdasarkan piksel demi piksel. Untuk setiap piksel di permukaan target, piksel melakukan pengujian menggunakan nilai yang sesuai dalam buffer stensil, nilai referensi stensil, dan nilai masker stensil. Jika pengujian lolos, Direct3D akan melakukan tindakan. Pengujian dilakukan menggunakan langkah-langkah berikut.

  1. Lakukan operasi bitwise AND dari nilai referensi stensil dengan masker stensil.
  2. Lakukan operasi bitwise AND dari nilai buffer stensil untuk piksel saat ini dengan masker stensil.
  3. Bandingkan hasil langkah 1 dengan hasil langkah 2, menggunakan fungsi perbandingan.

Langkah-langkah ini ditampilkan dalam contoh kode berikut.

(StencilRef & StencilMask) CompFunc (StencilBufferValue & StencilMask)
StencilBufferValue

adalah isi buffer stensil untuk piksel saat ini. Contoh kode ini menggunakan simbol ampersand (&) untuk mewakili operasi BITWISE AND.

StencilMask

mewakili nilai masker stensil, dan

StencilRef

mewakili nilai referensi stensil.

CompFunc

adalah fungsi perbandingan.

Piksel saat ini ditulis ke permukaan target jika pengujian stensil lolos, dan diabaikan sebaliknya. Perilaku perbandingan default adalah menulis piksel, tidak peduli bagaimana setiap operasi bitwise ternyata (D3DCMP_ALWAYS). Anda dapat mengubah perilaku ini dengan mengubah nilai status render D3DRS_STENCILFUNC, meneruskan anggota jenis enumerasi D3DCMPFUNC untuk mengidentifikasi fungsi perbandingan yang diinginkan.

Aplikasi Anda dapat menyesuaikan pengoperasian buffer stensil. Ini dapat mengatur fungsi perbandingan, masker stensil, dan nilai referensi stensil. Ini juga dapat mengontrol tindakan yang diambil Direct3D ketika pengujian stensil lulus atau gagal. Untuk informasi selengkapnya, lihat Status Buffer Stensil (Direct3D 9).

Contoh

Contoh kode berikut menunjukkan pengaturan buffer stensil.

// Enable stencil testing
pDevice->SetRenderState(D3DRS_STENCILENABLE, TRUE);

// Specify the stencil comparison function
pDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_EQUAL);

// Set the comparison reference value
pDevice->SetRenderState(D3DRS_STENCILREF, 0);

//  Specify a stencil mask 
pDevice->SetRenderState(D3DRS_STENCILMASK, 0);

Secara default, nilai referensi stensil adalah nol. Nilai bilangan bulat apa pun valid. Direct3D melakukan bitwise AND dari nilai referensi stensil dan nilai masker stensil sebelum pengujian stensil.

Anda dapat mengontrol informasi piksel apa yang ditulis tergantung pada perbandingan stensil.

// A write mask controls what is written
pDevice->SetRenderState(D3DRS_STENCILWRITEMASK, D3DSTENCILOP_KEEP);
// Specify when to write stencil data
pDevice->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP);

Anda dapat menulis rumus Anda sendiri untuk nilai yang ingin Anda tulis ke dalam buffer stensil seperti yang diperlihatkan dalam contoh berikut.

NewStencilBufferValue = (StencilBufferValue & ~StencilWriteMask) | 
                        (StencilWriteMask & StencilOp(StencilBufferValue))

Alur Piksel