Udostępnij przez


Reguły rasteryzacji

Reguły rasteryzacji definiują sposób mapowania danych wektorowych na dane rasterowe. Dane rastrowe są przyciągane do lokalizacji całkowitych, które następnie są skrupulatne i obcięte (aby narysować minimalną liczbę pikseli), a atrybuty na piksel są interpolowane (z atrybutów wierzchołka) przed przekazaniem do cieniowania pikseli.

Istnieje kilka typów reguł, które zależą od typu zamapowanego elementu pierwotnego, a także tego, czy dane używają wieloprzykładowych próbek w celu zmniejszenia aliasów. Na poniższych ilustracjach pokazano, jak są obsługiwane przypadki narożne.

Reguły rasteryzacji trójkątów (bez wieloamplingu)

Każdy środek piksela, który znajduje się wewnątrz trójkąta, jest rysowany; przyjmuje się, że piksel znajduje się wewnątrz, jeśli przekazuje regułę w lewym górnym rogu. Lewa górna reguła polega na tym, że środek piksela jest definiowany tak, aby leżał wewnątrz trójkąta, jeśli leży na górnej krawędzi lub lewej krawędzi trójkąta.

Gdzie:

  • Górna krawędź to krawędź, która jest dokładnie pozioma i znajduje się nad innymi krawędziami.
  • 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.

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

Jasne i ciemnoszary pokrycie pikseli pokazują je jako grupy pikseli, aby wskazać trójkąt, w którym znajdują się.

Reguły rasteryzacji wierszy (aliasowane, bez wieloamplingu)

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 y-główna jest każdą linią, która nie jest linią x-major; obszar diamentu testowego jest taki sam jak opisany dla linii x-major, z wyjątkiem prawego rogu jest również dołączony.

Biorąc pod uwagę obszar diamentu, linia obejmuje piksel, jeśli linia wychodzi z obszaru testowego diamentu piksela podczas podróży wzdłuż linii 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 się z renderowanym obiektem docelowym generującym wartości pokrycia na piksel, które są mnożone do składników danych wyjściowych alfa cieniowania pikseli. Nie ma preformowania antyaliasingowego podczas rysowania wierszy na wieloprzykładowym obiekcie docelowym renderowania.

Uważa się, że nie ma jednego "najlepszego" sposobu wykonywania renderowania linii antyaliased. Direct3D 10 przyjmuje jako wytyczne metody pokazanej na poniższej ilustracji. Ta metoda została pochodna empirycznie, wykazując wiele właściwości wizualnych uznanych 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. Żadna z tych elastyczności nie jest dozwolona w implementacji sprzętu, jednak można komunikować się za pośrednictwem direct3D 10 do aplikacji, poza zwykłym rysowaniem linii i obserwowaniem/pomiarem ich wyglądu.

ilustracja przykładów rasteryzacji linii antyaliasowej

Ten algorytm generuje stosunkowo gładkie linie z jednolitą intensywnością, z minimalnymi krawędziami postrzępionych lub warkoczem. Wzorzec Moire dla bliskich linii jest zminimalizowany. Istnieje dobre pokrycie skrzyżowań między segmentami liniowymi umieszczonymi na końcu. 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 do cieniowania pikseli o0.a (srcAlpha) na następującą formułę przez etap fuzji danych wyjściowych: srcColor * srcAlpha + destColor * (1-srcAlpha).

Reguły rasteryzacji punktów (bez wieloamplingu)

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 uboju punktów.

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

ilustracja przykładów rasteryzacji punktów

Wieloprzykładowe reguły rasteryzacji anty aliasów

Wieloprzykładowe antyaliasing (MSAA) zmniejsza alias geometryczny przy użyciu pokrycia pikseli i testów wzornika głębokości w wielu lokalizacjach próbki podrzędnej. Aby zwiększyć wydajność, obliczenia na piksel są wykonywane raz dla każdego pokrytego piksela, udostępniając dane wyjściowe cieniowania w pokrytych pod pikselach. Multisample antialiasing nie zmniejsza aliasów 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 antyalializacji wieloprzykładowych

Liczba przykładowych lokalizacji zależy od trybu wieloprzykładowego. Atrybuty wierzchołka są interpolowane w centrach pikseli, ponieważ jest to miejsce wywoływanego cieniowania pikseli (staje się to ekstrapolacją, jeśli środek nie jest pokryty). Atrybuty mogą być oflagowane w cieniu pikseli, aby być próbkowane centroid, co powoduje, że nieobjęte pikselami interpolacja atrybutu na przecięciu obszaru piksela i pierwotnego. 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łania cieniowania występują więcej niż pokazano, aby wypełnić minimum 2x2 kwanty (co jest niezależne od wieloprzykładowego). Wynik cieniowania jest zapisywany dla każdej pokrytej próbki, która przechodzi test wzornika głębokości próbki.

Reguły rasteryzacji dla typów pierwotnych są ogólnie niezmienione przez wieloprzykładowe antyaliasing, z wyjątkiem:

  • W przypadku trójkąta test pokrycia jest wykonywany dla każdej lokalizacji próbki (nie dla środka piksela). Jeśli ujęto więcej niż jedną lokalizację próbki, cieniowanie pikseli jest uruchamiane raz z atrybutami interpolowanym w środku pikseli. 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 wieloprzykładowe (zobacz Obsługa sprzętu w formatach Direct3D 10), niektóre formaty można rozpoznać (ResolveSubresource; który obniża próbkowanie wieloprzykładowego formatu na przykładowy rozmiar 1). Formaty wieloprzykładowe mogą być używane w elementach docelowych renderowania, które mogą być odczytywane z powrotem do cieniowania przy użyciu ładowania, ponieważ nie jest wymagane rozwiązanie dla poszczególnych próbek, do których uzyskuje się dostęp za pomocą cieniowania. 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 wieloampowy przy użyciu R8G8B8A8_TYPELESS, renderować go przy użyciu zasobu render-target-view z formatem R8G8B8A8_UINT, a następnie rozpoznać zawartość innego zasobu przy użyciu formatu danych R8G8B8A8_UNORM.

Obsługa sprzętu

Interfejs API zgłasza obsługę sprzętu dla wieluamplingów za pośrednictwem 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ści oznacza, że sprzęt obsługuje trzy różne układy przykładowe i/lub rozwiąże algorytmy. 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 wieleamplingów i ma _UNORM, _SRGB, _SNORM lub _FLOAT formaty, obsługuje również rozpoznawanie.

Centroid próbkowanie atrybutów, gdy wieloprzykładowe antialiasing

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 cieniowania pikseli zawierające semantykę centroidu (przy założeniu, że piksel nie jest w pełni pokryte) zostaną próbkowane gdzieś w obszarze pokrytym pikselem, prawdopodobnie w jednej z omówionych lokalizacji próbki. Przykładowa maska (określona przez stan rasteryzatora) jest stosowana przed obliczeniami centroid. W związku z tym próbka, która jest zamaskowana, nie będzie używana jako lokalizacja centroid.

Rasteryzator odwołania wybiera przykładową lokalizację próbkowania centroid podobnego do następującego:

  • Przykładowa maska zezwala na wszystkie próbki. Użyj środka piksela, jeśli piksel jest pokryty lub jeśli żadna z próbek nie jest objęta. W przeciwnym razie wybierana jest pierwsza omówiona próbka, zaczynając od środka piksela i przenosząc się na zewnątrz.
  • Maska przykładowa wyłącza wszystkie próbki, ale jedną (typowy scenariusz). Aplikacja może implementować supersampling multipass poprzez przechodzenie na rowerze przez wartości maski próbek jedno bitowych i ponowne renderowanie sceny dla każdej próbki przy użyciu próbkowania centroid. 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 wieloamplingu

Cieniowania pikseli zawsze są uruchamiane przy użyciu co najmniej 2x2 pikseli obszaru do obsługi obliczeń pochodnych, które są obliczane przez wykonywanie różnic między danymi z sąsiednich pikseli (co sprawia, że dane w każdym pikselu zostały próbkowane z odstępami jednostkowymi w poziomie lub w pionie). Nie ma to wpływu na wieloprzykładowe próbkowanie.

Jeśli pochodne są żądane na atrybucie, który został próbkowany centroid, obliczenia sprzętowe nie są dostosowywane, co może powodować niedokładne pochodne. Cieniowanie będzie oczekiwać wektora jednostki w przestrzeni docelowej renderowania, ale może uzyskać wektor niejednostki w odniesieniu do innej przestrzeni wektorowej. W związku z tym obowiązkiem aplikacji jest zachowanie ostrożności podczas żądania pochodnych z atrybutów, które są próbkowane centroid. W rzeczywistości zaleca się, aby nie łączyć pochodnych i próbkowania centroidów. Próbkowanie Centroid może być przydatne w sytuacjach, w których krytyczne jest, że atrybuty interpolowane elementu pierwotnego nie są ekstrapolowane, ale wiąże się to z kompromisami, takimi jak atrybuty, które wydają się skakać, gdy pierwotna krawędź przecina piksel (a nie zmienia się stale) lub pochodnych, które nie mogą być używane przez operacje próbkowania tekstury, które pochodzą LOD.

etapu rasteryzatora