Aracılığıyla paylaş


Kalıp Arabellek Teknikleri (Direct3D 9)

Uygulamalar, bir görüntüdeki pikselleri maskelerken kalıp arabelleği kullanır. Maske, pikselin çizilip çizilmeyeceğini denetler. Daha yaygın etkilerden bazıları aşağıda gösterilmiştir.

Kalıp arabelleği, işleme hedef yüzeyine piksel bazında çizimi etkinleştirir veya devre dışı bırakır. En temel düzeyde, uygulamaların işlenen görüntünün bölümlerini maskeleyip görüntülenmemelerini sağlar. Uygulamalar genellikle çözünür, ölçeklendirme ve ana hat oluşturma gibi özel efektler için kalıp arabellekleri kullanır.

Kalıp arabelleği bilgileri z-buffer verilerine eklenir. Uygulamanız, aşağıdaki kod örneğinde gösterildiği gibi donanım kalıbı desteğini denetlemek için IDirect3D9::CheckDeviceFormat yöntemini kullanabilir.

// 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, o cihazın özelliklerine göre oluşturulacak bir cihaz seçmenize olanak tanır. Bu durumda, 8 bit kalıp arabelleklerini desteklemeyen cihazlar reddedilir. bunun IDirect3D9::CheckDeviceFormatiçin yalnızca bir olası kullanım olduğunu unutmayın; Ayrıntılar için bkz. Donanım Desteğini Belirleme (Direct3D 9).

Kalıp Arabelleği Nasıl Çalışır?

Direct3D, kalıp arabelleğinin içeriği üzerinde piksel bazında bir test gerçekleştirir. Hedef yüzeydeki her piksel için, kalıp arabelleğindeki karşılık gelen değeri, kalıp başvuru değerini ve kalıp maskesi değerini kullanarak bir test gerçekleştirir. Test başarılı olursa Direct3D bir eylem gerçekleştirir. Test aşağıdaki adımlar kullanılarak gerçekleştirilir.

  1. Kalıp maskesiyle kalıp başvuru değerinin bit düzeyinde AND işlemini gerçekleştirin.
  2. Kalıp maskesiyle geçerli piksel için kalıp arabellek değerinin bit düzeyinde AND işlemini gerçekleştirin.
  3. Karşılaştırma işlevini kullanarak 1. adımın sonucunu 2. adımın sonucuyla karşılaştırın.

Bu adımlar aşağıdaki kod örneğinde gösterilmiştir.

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

geçerli piksel için kalıp arabelleğinin içeriğidir. Bu kod örneği, bit düzeyinde AND işlemini temsil etmek için ve işareti (&) simgesini kullanır.

StencilMask

kalıp maskesinin değerini temsil eder ve

StencilRef

kalıp başvuru değerini temsil eder.

CompFunc

karşılaştırma işlevidir.

Kalıp testi geçerse geçerli piksel hedef yüzeye yazılır ve aksi takdirde yoksayılır. Varsayılan karşılaştırma davranışı, bit düzeyindeki işlemlerin (D3DCMP_ALWAYS) nasıl sonuçlandığından bağımsız olarak pikseli yazmaktır. İstenen karşılaştırma işlevini tanımlamak için D3DRS_STENCILFUNC işleme durumunun değerini değiştirerek D3DCMPFUNC numaralandırılmış türünün bir üyesini geçirerek bu davranışı değiştirebilirsiniz.

Uygulamanız kalıp arabelleğinin işlemini özelleştirebilir. Karşılaştırma işlevini, kalıp maskesini ve kalıp başvuru değerini ayarlayabilir. Ayrıca kalıp testi geçtiğinde veya başarısız olduğunda Direct3D'nin gerçekleştirilen eylemi de denetleyebiliyor. Daha fazla bilgi için bkz. Kalıp Arabellek Durumu (Direct3D 9).

Örnekler

Aşağıdaki kod örnekleri, kalıp arabelleğinin ayarlanmasını gösterir.

// 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);

Varsayılan olarak, kalıp başvuru değeri sıfırdır. Herhangi bir tamsayı değeri geçerlidir. Direct3D, kalıp testi öncesinde kalıp başvuru değerinin bit düzeyinde AND ve kalıp maskesi değerini gerçekleştirir.

Kalıp karşılaştırması bağlı olarak hangi piksel bilgilerinin yazıldıgını denetleyebilirsiniz.

// 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);

Aşağıdaki örnekte gösterildiği gibi kalıp arabelleğine yazılmasını istediğiniz değer için kendi formülünüzü yazabilirsiniz.

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

Piksel İşlem Hattı