Techniki buforu wzornika (Direct3D 9)
Aplikacje używają buforu wzornika do maskowania pikseli na obrazie. Maska określa, czy piksel jest rysowany, czy nie. Poniżej przedstawiono niektóre z bardziej typowych skutków.
- komponowanie
- skalowania
- rozpuszcza się, zanika i machnięcia
- kontury i sylwetki
- wzornikaTwo-Sided
Bufor wzornika umożliwia lub wyłącza rysowanie na powierzchni docelowej renderowania na podstawie pikseli. Na najbardziej podstawowym poziomie umożliwia aplikacjom maskowanie sekcji renderowanego obrazu tak, aby nie były wyświetlane. Aplikacje często używają wzornika do efektów specjalnych, takich jak rozpuszczenie, skalowanie i konspektowanie.
Informacje o buforze wzornika są osadzone w danych buforu z. Aplikacja może użyć metody IDirect3D9::CheckDeviceFormat, aby sprawdzić obsługę wzornika sprzętowego, jak pokazano w poniższym przykładzie kodu.
// 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 umożliwia wybranie urządzenia do utworzenia na podstawie możliwości tego urządzenia. W takim przypadku urządzenia, które nie obsługują 8-bitowych wzorników, są odrzucane. Należy pamiętać, że jest to tylko jedno możliwe użycie dla IDirect3D9::CheckDeviceFormat; aby uzyskać szczegółowe informacje, zobacz Określanie obsługi sprzętu (Direct3D 9).
Jak działa bufor wzornika
Funkcja Direct3D wykonuje test na zawartości buforu wzornika na podstawie pikseli. Dla każdego piksela na powierzchni docelowej wykonuje test przy użyciu odpowiedniej wartości w buforze wzornika, wartości referencyjnej wzornika i wartości maski wzornika. Jeśli test zakończy się pomyślnie, funkcja Direct3D wykonuje akcję. Test jest wykonywany przy użyciu poniższych kroków.
- Wykonaj bitową operację AND wartości odwołania wzornika z maską wzornika.
- Wykonaj bitową operację AND wartości buforu wzornika dla bieżącego piksela za pomocą maski wzornika.
- Porównaj wynik kroku 1 z wynikiem kroku 2 przy użyciu funkcji porównania.
Te kroki przedstawiono w poniższym przykładzie kodu.
(StencilRef & StencilMask) CompFunc (StencilBufferValue & StencilMask)
StencilBufferValue
to zawartość buforu wzornika dla bieżącego piksela. W tym przykładzie kodu użyto symbolu ampersand (&) do reprezentowania operacji bitowej AND.
StencilMask
reprezentuje wartość maski wzornika i
StencilRef
reprezentuje wartość referencyjną wzornika.
CompFunc
jest funkcją porównania.
Bieżący piksel jest zapisywany na powierzchni docelowej, jeśli test wzornika zakończy się pomyślnie i zostanie zignorowany w przeciwnym razie. Domyślne zachowanie porównania polega na zapisie piksela niezależnie od tego, jak okazuje się każda operacja bitowa (D3DCMP_ALWAYS). To zachowanie można zmienić, zmieniając wartość D3DRS_STENCILFUNC stanu renderowania, przekazując element członkowski typu D3DCMPFUNC wyliczonego w celu zidentyfikowania żądanej funkcji porównania.
Aplikacja może dostosować działanie buforu wzornika. Może ustawić funkcję porównania, maskę wzornika i wartość referencyjną wzornika. Może również kontrolować akcję wykonywaną przez direct3D, gdy test wzornika zakończy się pomyślnie lub zakończy się niepowodzeniem. Aby uzyskać więcej informacji, zobacz stan buforu wzornika (Direct3D 9).
Przykłady
W poniższych przykładach kodu pokazano konfigurowanie buforu wzornika.
// 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);
Domyślnie wartość odwołania wzornika to zero. Każda wartość całkowita jest prawidłowa. Funkcja Direct3D wykonuje bitową wartość i wartość referencyjną wzornika oraz wartość maski wzornika przed testem wzornika.
Możesz kontrolować, jakie informacje o pikselach są zapisywane w zależności od porównania wzornika.
// 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);
Możesz napisać własną formułę dla wartości, którą chcesz zapisać w buforze wzornika, jak pokazano w poniższym przykładzie.
NewStencilBufferValue = (StencilBufferValue & ~StencilWriteMask) |
(StencilWriteMask & StencilOp(StencilBufferValue))
Tematy pokrewne