Co to jest bufor wzornika?

26

Wikipedia stwierdza, że bufor wzornika jest jakimś dowolnym buforem, którego może używać moduł cieniujący.

Wskazuje jednak, że jest używany do obcinania lub do „ścisłego wiązania” buforów głębi i pikseli, co jest nieco sprzeczne.

Co tak naprawdę robi bufor wzornika i jak jest on praktycznie stosowany w nowoczesnych aplikacjach?

Qix
źródło

Odpowiedzi:

31

Definicja bufora szablonów przez Wikipedię naprawdę nie jest świetna, zbyt mocno koncentruje się na szczegółach współczesnych implementacji (OpenGL). Uważam, że wersja jednoznaczna jest łatwiejsza do zrozumienia:

Szablon to szablon służący do rysowania lub malowania za każdym razem identycznych liter, symboli, kształtów lub wzorów. Projekt utworzony przez taki szablon jest również nazywany szablonem.

To właśnie oznaczało szablon przed grafiką komputerową. Jeśli wpiszesz szablon w Grafice Google, jest to jeden z pierwszych wyników:

Maska wzornikowa

Jak widać, jest to po prostu maska ​​lub wzór, którego można użyć do „namalowania” negatywu wzoru na czymś.

Stencil buffer prac w dokładnie taki sam sposób. Można wypełnić bufor szablonu wybranym wzorem, wykonując przejście renderowania szablonu, a następnie ustawić odpowiednią funkcję szablonu, która określi sposób interpretacji wzoru na kolejnych rysunkach, a następnie wyrenderuje końcową scenę. Piksele, które wpadają w odrzucone obszary maski szablonu, zgodnie z funkcją porównania, nie są rysowane.


Jeśli chodzi o implementację bufora szablonów, czasami rzeczywiście jest on sprzężony z buforem głębokości. Większość urządzeń graficznych korzysta z 1-bajtowego (8-bitowego) bufora szablonów, co wystarcza w większości aplikacji. Bufory głębokości są zwykle implementowane przy użyciu 3 bajtów (24 bity), co znowu jest zwykle wystarczające dla większości rodzajów renderowania 3D. Logiczne jest więc spakowanie 8 bitów bufora szablonu z innymi 24 buforami głębokości, dzięki czemu możliwe jest zapisanie każdego piksela głębokości + szablonu w 32-bitowej liczbie całkowitej. To właśnie Wikipedia rozumiała przez:

Bufor głębokości i bufor wzornika często dzielą ten sam obszar w pamięci RAM sprzętu graficznego.


Jedną z aplikacji, w której bufor wzornika był królem, był rendering cienia, w technice zwanej objętościami cieni , a czasem także odpowiednio zwanymi cieniami wzornikowymi . Było to bardzo sprytne użycie bufora, ale obecnie wydaje się, że większość pola renderowania przesunęła się w kierunku map cieni opartych na głębokości.

glampert
źródło
To jedna postać, ale cleaver-> clever. Nie mogę go edytować D: Nawiasem mówiąc, świetna odpowiedź, to jak dotąd najbardziej sensowne.
Qix
3
Jeśli masz drogi moduł cieniujący na piksel, bufor szablonów można również wykorzystać do grupowania podobnych wątków, zmniejszając rozbieżności i zwiększając obłożenie, jak w tym dokumencie OIT, rozdział 2.6 (zastrzeżenie: jestem autorem).
jozxyqk
@ jozxyqk, to trochę nieszablonowe myślenie tutaj! Bardzo dobrze.
glampert,
13

Bufor wzorników jest buforem liczb całkowitych bez znaku, zwykle obecnie 8-bitowym, w którym można wypełnić informacje o pikselach według własnego uznania, w zależności od użycia różnych operacji ( na przykład tutaj OpenGL Ops ) po teście wzornika.

Test matrycowy to po prostu operacja na piksel, w której bieżąca wartość matrycy pikselowej jest testowana względem zawartości bufora matrycowego. Ustawiasz warunek, w którym test szablonu jest przekazywany (np. ZAWSZE, MNIEJ itp.).

Możesz zdecydować, co stanie się z wartością szablonu w zależności od wyniku testu (w OpenGL, korzystając z operacji, którą podłączyłem powyżej)

Bufor szablonów ma kilka zastosowań, z których pierwsze przychodzą na myśl:

  • Można go użyć jako maski do selektywnego renderowania pewnej części bufora ramki, a resztę odrzucić. Jest to na przykład przydatne w odbiciach, ale także o wiele więcej. W przypadku renderowania w wielu rozdzielczościach można go wykorzystać do oznaczania krawędzi, które należy renderować w wyższej rozdzielczości. Naprawdę istnieje wiele zastosowań maskowania.
  • Na przykład bardzo prosty filtr overdraw. Możesz ustawić test szablonu, aby zawsze przechodził i zawsze zwiększał wartość. Wartość, którą znajdziesz w buforze szablonów, reprezentuje twoje przekroczenie. [*]

W przeszłości był używany również do technik cieniowania, takich jak objętość cienia.

Słaby bufor szablonu jest często niedoceniany, ale może być dobrą bronią w zbrojowni programisty.

[*] Wartość do odczytania w późniejszym procesie przy użyciu odpowiedniego SRV!

EDYCJA: Warto również wspomnieć, że w Shader Model 5.1 (czyli D3D11.3 i D3D12) masz dostęp do wartości odniesienia szablonu za pośrednictwem SV_StencilRef

CIFZ
źródło
6

Bufor wzornika zawiera dane liczbowe na piksel, które są używane do zwiększenia kontroli nad tym, które piksele są renderowane.

Bufor wzornika działa podobnie do bufora głębokości. Podobnie dane szablonu są przechowywane w buforze głębokości. Dane głębokości określają, który piksel jest najbliżej kamery, ale dane szablonu mogą być używane jako bardziej ogólna maska ​​na piksel do zapisywania lub odrzucania pikseli. Aby utworzyć maskę, użyj funkcji wzornika, aby porównać referencyjną wartość wzornika - wartość globalną - z wartością w buforze wzornika przy każdym renderowaniu piksela.

Źródło: Co to jest bufor wzornika? | Microsoft Developer Network

Ogólna idea jest taka, że można ustawić wartość dla każdego piksela, a następnie ustawić operację ( GREATER, SMALLER, EQUALetc), kiedy to wartość true piksel jest zacieniony i pokazane.

Jedną z aplikacji jest odbicie w czasie rzeczywistym, podczas renderowania tekstury odbicia bufor wzornika służy do utworzenia maski, w której zastosowano odbicie. Na przykład zastosuj odbicie tylko do cieniowanych trójkątów z materiału szklanego. Można go również wykorzystać do utworzenia dowolnych dwuwymiarowych masek dla całego bufora ramki.

Maurice Laveaux
źródło