Reguły rasteryzacji

Reguły rasteryzacji definiują sposób mapowania danych wektorowych na dane rasterowe. Dane rastrowe są przypisywane do współrzędnych całkowitych, a następnie odrzucane i przycinane (aby narysować minimalną liczbę pikseli), a atrybuty dla każdego piksela są interpolowane (z atrybutów wierzchołków) przed przekazaniem do shadera pikseli.

Istnieje kilka rodzajów reguł, które zależą od typu mapowanego prymitywu, a także od tego, czy w danych stosuje się multisampling, aby ograniczyć aliasing. Na poniższych ilustracjach pokazano, jak są obsługiwane przypadki narożne.

Note

Te reguły rasteryzacji Direct3D mają zastosowanie do aplikacji niezależnie od tego, czy korzystają z modelu aplikacji Win32 czy UWP.

Reguły rasteryzacji trójkątów (bez próbkowania wielokrotnego)

Każdy piksel, którego środek znajduje się wewnątrz trójkąta, zostaje narysowany; przyjmuje się, że piksel znajduje się wewnątrz, jeśli spełnia regułę górnej i lewej krawędzi. Zasada lewego górnego narożnika definiuje, że środek piksela znajduje się wewnątrz trójkąta, jeśli leży na górnej krawędzi i nie leży na prawej krawędzi lub jeśli leży na lewej krawędzi i nie leży na dolnej krawędzi.

Gdzie:

  • Górna krawędź to krawędź, która jest dokładnie pozioma i znajduje się nad innymi krawędziami.
  • Dolna krawędź to krawędź, która jest dokładnie pozioma i znajduje się poniżej innych krawędzi.
  • Lewa krawędź to krawędź, która nie jest dokładnie pozioma i znajduje się po lewej stronie trójkąta. Trójkąt może mieć jedną lub dwie lewe krawędzie.
  • Prawa krawędź to krawędź, która nie jest dokładnie pozioma i znajduje się po prawej stronie trójkąta. Trójkąt może mieć jedną lub dwie prawe krawędzie.

Reguła w lewym górnym rogu gwarantuje, że sąsiadujące trójkąty są rysowane raz.

Na tej ilustracji przedstawiono przykłady pikseli, które są rysowane, ponieważ znajdują się wewnątrz trójkąta lub są zgodne z regułą w lewym górnym rogu.

ilustracja przykładów rasteryzacji trójkąta w lewym górnym rogu

Jasnoszare i ciemnoszare pokrycie pikseli przedstawia je jako grupy, aby wskazać, do którego trójkąta należą.

Reguły rasteryzacji linii (z postrzępionymi krawędziami, bez multisamplingu)

Reguły rasteryzacji linii używają obszaru testowego diamentu, aby określić, czy linia obejmuje piksel. W przypadku linii x-głównych (linie z -1 <= nachylenie <= +1), obszar testowy diamentu zawiera (pokazaną solidnie) lewą dolną krawędź, prawą krawędź dolną i dolny róg; romb wyklucza (pokazano kropkowane) lewą górną krawędź, prawą górną krawędź, górny korder, lewy róg i prawy róg. Linia głównie wzdłuż osi y to każda linia, która nie jest linią głównie wzdłuż osi x; obszar rombu testowego jest taki sam jak w przypadku linii głównie wzdłuż osi x, z wyjątkiem tego, że uwzględnia się również prawy róg.

Uwzględniając obszar rombu, linia obejmuje piksel, jeśli opuszcza obszar testowy rombu piksela, przemieszczając się wzdłuż niej od początku do końca. Pasek liniowy zachowuje się tak samo, jak jest rysowany jako sekwencja linii.

Na poniższej ilustracji przedstawiono kilka przykładów.

ilustracja przykładów rasteryzacji linii aliasowanej

Reguły rasteryzacji linii (antyaliased, bez wieloamplingu)

Linia antyaliasowana jest rasteryzowana tak, jakby była prostokątem (o szerokości = 1). Prostokąt przecina cel renderowania, w wyniku czego powstają wartości pokrycia dla poszczególnych pikseli, które są mnożone przez składowe alfa danych wyjściowych shadera pikseli. Podczas rysowania linii na wielopróbkowym obiekcie docelowym renderowania nie jest stosowane wygładzanie krawędzi.

Uważa się, że nie ma jednego "najlepszego" sposobu wykonywania renderowania linii antyaliased. Direct3D 10 przyjmuje jako wytyczne metody pokazanej na poniższej ilustracji. Metoda ta została wyprowadzona empirycznie i wykazuje szereg właściwości wizualnych uznawanych za pożądane. Sprzęt nie musi dokładnie odpowiadać temu algorytmowi; testy w odniesieniu do tego odwołania mają "uzasadnione" tolerancje, prowadzone przez niektóre z zasad wymienionych poniżej, zezwalając na różne implementacje sprzętowe i rozmiary jądra filtru. Żadnej z tych możliwości dopuszczalnych na poziomie implementacji sprzętowej nie można jednak przekazać aplikacjom za pośrednictwem Direct3D 10 inaczej niż po prostu rysując linie i obserwując/mierząc, jak wyglądają.

ilustracja przykładów rasteryzacji linii antyaliasowej

Ten algorytm generuje stosunkowo gładkie linie o jednolitej intensywności, z minimalnym efektem poszarpanych krawędzi lub przeplatania. Wzorzec Moire dla bliskich linii jest zminimalizowany. Zapewniono dobre pokrycie połączeń między odcinkami linii ułożonymi końcami do siebie. Jądro filtru jest rozsądnym kompromisem między ilością rozmycia krawędzi a zmianami intensywności spowodowanymi korektami gamma. Wartość pokrycia jest mnożona przez składową o0.a (srcAlpha) shadera pikseli zgodnie z następującym wzorem na etapie scalania danych wyjściowych: srcColor * srcAlpha + destColor * (1-srcAlpha).

Reguły rasteryzacji punktów (bez próbkowania wielokrotnego)

Punkt jest interpretowany tak, jakby składał się z dwóch trójkątów we wzorcu Z, które używają reguł rasteryzacji trójkątów. Współrzędna identyfikuje środek kwadratu o szerokości jednego piksela. Nie ma odrzucania punktów.

Na poniższej ilustracji przedstawiono kilka przykładów.

ilustracja przykładów rasteryzacji punktów

Reguły rasteryzacji wielopróbkowego antyaliasingu

Wielopróbkowe wygładzanie krawędzi (MSAA) zmniejsza aliasing geometryczny przy użyciu pokrycia pikseli oraz testów głębokości i szablonu w wielu położeniach podpróbek. Aby zwiększyć wydajność, obliczenia dla każdego piksela są wykonywane tylko raz dla każdego pokrytego piksela przez współdzielenie danych wyjściowych programu cieniującego między pokrytymi subpikselami. Multisample antialiasing nie zmniejsza aliasingu powierzchni. Przykładowe lokalizacje i funkcje rekonstrukcji są zależne od implementacji sprzętu.

Na poniższej ilustracji przedstawiono kilka przykładów.

ilustracja przykładów rasteryzacji z wielopróbkowym antyaliasingiem

Liczba przykładowych lokalizacji zależy od trybu wieloprzykładowego. Atrybuty wierzchołków są interpolowane w środkach pikseli, ponieważ w tym miejscu wywoływany jest shader pikseli (wówczas jest to ekstrapolacja, jeśli środek nie jest objęty pokryciem). Atrybuty w shaderze pikseli mogą być oznaczone do próbkowania centroidowego, co powoduje, że w przypadku pikseli niepokrytych atrybut jest interpolowany w punkcie przecięcia obszaru piksela i prymitywu. Cieniowanie pikseli jest uruchamiane dla każdego obszaru 2x2 pikseli w celu obsługi obliczeń pochodnych (które używają różnic x i y). Oznacza to, że wywołań shadera jest więcej, niż pokazano, aby wypełnić minimalne bloki 2x2 (co jest niezależne od multisamplingu). Wynik cieniowania jest zapisywany dla każdej pokrytej próbki, która przechodzi test wzornika głębokości próbki.

Reguły rasteryzacji dla prymitywów pozostają zasadniczo niezmienione przy wielopróbkowym wygładzaniu krawędzi, z wyjątkiem:

  • W przypadku trójkąta test pokrycia jest wykonywany dla każdej lokalizacji próbki (nie dla środka piksela). Jeśli objęte jest więcej niż jedno położenie próbki, shader pikseli jest uruchamiany raz z atrybutami interpolowanymi w centrum piksela. Wynik jest przechowywany (replikowany) dla każdej objętej próbką lokalizacji w pikselu, który przechodzi test głębokości/wzornika.

    Linia jest traktowana jako prostokąt składający się z dwóch trójkątów o szerokości linii 1,4.

  • W przypadku punktu test pokrycia jest wykonywany dla każdej lokalizacji próbki (nie dla środka piksela).

Wiele formatów obsługuje multisampling (zobacz Obsługa formatów Direct3D 10 przez sprzęt), niektóre formaty można przekształcić za pomocą ResolveSubresource (która redukuje format multisamplowany do rozmiaru próbki 1). Formaty multisamplingu mogą być używane w celach renderowania, które mogą być odczytywane w shaderach przy użyciu load, ponieważ dla poszczególnych próbek, do których shader uzyskuje dostęp, nie jest wymagana operacja resolve. Formaty głębokości nie są obsługiwane w przypadku zasobów wieloprzykładowych, dlatego formaty głębokości są ograniczone tylko do renderowania obiektów docelowych.

Formaty bez typów (na przykład R8G8B8A8_TYPELESS) obsługują wieloprzykładowe przetwarzanie, aby umożliwić widokowi zasobów interpretowanie danych na różne sposoby. Można na przykład utworzyć zasób wielopróbkowy przy użyciu R8G8B8A8_TYPELESS, renderować do niego przy użyciu zasobu widoku celu renderowania w formacie danych R8G8B8A8_UINT, a następnie wykonać operację resolve zawartości do innego zasobu przy użyciu formatu danych R8G8B8A8_UNORM.

Obsługa sprzętu

Interfejs API informuje o sprzętowej obsłudze multisamplingu na podstawie liczby poziomów jakości. Na przykład poziom jakości 0 oznacza, że sprzęt nie obsługuje wieloamplingu (na określonym poziomie formatu i jakości). Wartość 3 dla poziomów jakościowych oznacza, że sprzęt obsługuje trzy różne układy próbek i/lub algorytmy resolve. Można również założyć następujące założenia:

  • Każdy format obsługujący wieloprzykładowe próbkowanie obsługuje tę samą liczbę poziomów jakości dla każdego formatu w tej rodzinie.
  • Każdy format, który obsługuje multisampling i ma warianty _UNORM, _SRGB, _SNORM lub _FLOAT, obsługuje również operację resolve.

Centroidalne próbkowanie atrybutów przy wygładzaniu krawędzi z wielokrotnym próbkowaniem

Domyślnie atrybuty wierzchołka są interpolowane do środka pikseli podczas wieloprzykładowej antyalializacji; Jeśli środek piksela nie jest pokryty, atrybuty są ekstrapolowane do środka pikseli. Jeśli dane wejściowe cieniarki pikseli zawierają semantykę centroid (przy założeniu, że piksel nie jest w pełni pokryty), będą próbkowane gdzieś w obszarze pikselu objętym pokryciem, być może w jednym z położeń próbkowania objętych pokryciem. Maska próbek (określona przez stan rasteryzatora) jest nakładana przed obliczeniem centroidu. W związku z tym zamaskowana próbka nie będzie wykorzystywana jako położenie centroidu.

Referencyjny rastrowizator wybiera położenie próbki dla próbkowania centroidalnego w sposób podobny do poniższego:

  • Maska próbek dopuszcza wszystkie próbki. Użyj środka piksela, jeśli piksel jest pokryty lub jeśli żadna z próbek nie jest pokryta. W przeciwnym razie wybierana jest pierwsza omówiona próbka, zaczynając od środka piksela i przenosząc się na zewnątrz.
  • Maska próbek wyłącza wszystkie próbki z wyjątkiem jednej (częsty scenariusz). Aplikacja może zaimplementować wieloprzebiegowy supersampling przez sekwencyjne przechodzenie przez jednobitowe wartości maski próbek i ponowne renderowanie sceny dla każdej próbki przy użyciu próbkowania centroidowego. Wymagałoby to, aby aplikacja dostosowywała pochodne, aby wybrać odpowiednio bardziej szczegółowe mips tekstury dla większej gęstości próbkowania tekstury.

Obliczenia pochodne podczas multisamplingu

Shadery pikseli są zawsze wykonywane w obszarze co najmniej 2x2 pikseli, aby umożliwić obliczanie pochodnych, które wyznacza się na podstawie różnic między danymi z sąsiednich pikseli (przy założeniu, że dane w każdym pikselu zostały próbkowane w odstępie jednostkowym w poziomie lub w pionie). Nie ma to wpływu na wieloprzykładowe próbkowanie.

Jeśli pochodne są wyznaczane dla atrybutu próbkowanego w centroidzie, sprzętowe obliczanie nie jest odpowiednio dostosowywane, co może powodować niedokładne wartości pochodnych. Shader będzie oczekiwać wektora jednostkowego w przestrzeni render targetu, ale może otrzymać wektor niejednostkowy względem innej przestrzeni wektorowej. W związku z tym to aplikacja odpowiada za zachowanie ostrożności podczas wyznaczania pochodnych na podstawie atrybutów próbkowanych w centroidzie. W rzeczywistości zaleca się, aby nie łączyć pochodnych i próbkowania centroidów. Próbkowanie w środku ciężkości może być przydatne w sytuacjach, w których istotne jest, aby interpolowane atrybuty prymitywu nie były ekstrapolowane, ale wiąże się to z pewnymi kompromisami, takimi jak atrybuty, które sprawiają wrażenie skokowo zmieniających się w miejscu, gdzie krawędź prymitywu przecina piksel (zamiast zmieniać się płynnie), lub pochodne, których nie można używać w operacjach próbkowania tekstur wyznaczających LOD.

Etap rasteryzacji