Udostępnij przez


próbkowanie najbliższego punktu

Aplikacje nie są wymagane do używania filtrowania tekstur. Direct3D można ustawić tak, aby wyznaczał adres texela, który często nie odpowiada liczbie całkowitej, i kopiuje kolor texela z najbliższym adresem całkowitym. Ten proces nazywa się próbkowaniem najbliższego punktu. Próbkowanie najbliższego punktu może być tak, jakby rozmiar tekstury był podobny do rozmiaru obrazu pierwotnego na ekranie. W przeciwnym razie tekstura musi być powiększona lub zmniejszona. Wynikiem niezgodności rozmiarów tekstur z pierwotnym rozmiarem obrazu może być poszarpany, zaliasowany lub rozmyty obraz.

Należy ostrożnie używać próbkowania najbliższego punktu, ponieważ czasami może to powodować artefakty graficzne, gdy tekstura jest próbkowana na granicy między dwoma elementami obrazu (texelami). Granica ta jest położeniem wzdłuż tekstury (u lub v), od której próbkowany texel przechodzi z jednego texela do następnego. Gdy próbkowanie punktów jest używane, system wybiera jedną próbkę texel lub drugą, a wynik może nagle zmienić się z jednego texela na następny texel, gdy granica jest przekraczana. Ten efekt może pojawić się jako niepożądane artefakty graficzne w wyświetlanej teksturze. W przypadku stosowania filtrowania liniowego, wynikowy texel jest obliczany z sąsiednich texeli i płynnie miesza się między nimi, gdy indeks tekstury przechodzi przez granicę.

Ten efekt można zobaczyć podczas mapowania bardzo małej tekstury na bardzo duży wielokąt: operacja często nazywana powiększeniami. Na przykład przy użyciu tekstury, która wygląda jak szachownica, próbkowanie najbliższych punktów skutkuje większą szachownicą, która pokazuje wyraźne krawędzie. Natomiast filtrowanie tekstur liniowych powoduje powstanie obrazu, w którym kolory szachownicy różnią się płynnie w obrębie wielokąta.

W większości przypadków aplikacje otrzymują najlepsze wyniki, unikając próbki najbliższego punktu wszędzie tam, gdzie jest to możliwe. Większość sprzętu jest obecnie zoptymalizowana pod kątem filtrowania liniowego, więc aplikacja nie powinna mieć obniżonej wydajności. Jeśli pożądany efekt absolutnie wymaga użycia próbkowania najbliższego punktu — takiego jak w przypadku używania tekstur do wyświetlania czytelnych znaków tekstowych — aplikacja powinna być bardzo ostrożna, aby uniknąć próbkowania na granicach texelu, co może spowodować niepożądane efekty. Na poniższej ilustracji przedstawiono, jak mogą wyglądać te artefakty.

ilustracja sześcioczęściowego pudełka z nieciągłymi liniami poziomymi w dwóch górnych prawych kwadratach

Dwa kwadraty w prawym górnym rogu grupy wyglądają inaczej niż ich sąsiedzi, z ukośnymi przesunięciami przecinającymi je. Aby uniknąć takich artefaktów graficznych, musisz zapoznać się z regułami próbkowania tekstur Direct3D w celu filtrowania najbliższego punktu. Direct3D mapuje współrzędną tekstury zmiennoprzecinkowej z zakresu od [0.0, 1.0] (od 0.0 do 1.0, włącznie) do całkowitoliczbowej wartości przestrzeni texeli w zakresie od [-0.5, n - 0.5], gdzie n jest liczbą texeli w danym wymiarze tekstury. Wynikowy indeks tekstury jest zaokrąglany do najbliższej liczby całkowitej. To mapowanie może prowadzić do niedokładności próbkowania na granicach texel.

Aby uzyskać prosty przykład, wyobraź sobie aplikację, która renderuje wielokąty z trybem adresowania tekstury 'Wrap'. Mapowanie stosowane przez Direct3D mapuje indeks tekstury u zgodnie z poniższym diagramem dla tekstury o szerokości 4 tekseli.

diagram współrzędnych tekstury 0,0 i 1,0 na granicy między tekslami

Współrzędne tekstury, 0,0 i 1,0 dla tej ilustracji, są dokładnie na granicy między texelami. Korzystając z metody mapowania wartości przez Direct3D, współrzędne tekstury mieszczą się w zakresie od [ - 0,5 do 4 - 0,5], gdzie 4 oznacza szerokość tekstury. W tym przypadku próbkowany texel to texel 0 dla indeksu tekstury wynoszącego 1,0. Jeśli jednak współrzędna tekstury była nieco mniejsza niż 1,0, próbkowany texel byłby texelem n zamiast 0 texel.

Implikacją jest to, że powiększanie małej tekstury przy użyciu współrzędnych tekstury dokładnie 0,0 i 1,0 z filtrowaniem najbliższego punktu na trójkącie wyrównanym względem przestrzeni ekranu powoduje, że piksele, dla których mapa tekstury jest próbkowana, znajdują się na granicy między texelami. Wszelkie niedokładności w obliczeniach współrzędnych tekstury, jednak małe, powodują artefakty wzdłuż obszarów na renderowanych obrazach, które odpowiadają krawędziom tekselu mapy tekstury.

Wykonanie tego mapowania współrzędnych tekstury zmiennoprzecinkowych na całkowite texele z perfekcyjną dokładnością jest trudne, czasochłonne pod względem obliczeń i ogólnie nie jest konieczne. Większość implementacji sprzętu używa iteracyjnego podejścia do obliczania współrzędnych tekstury w każdej lokalizacji pikseli w trójkątach. Podejścia iteracyjne mają tendencję do ukrywania tych niedokładności, ponieważ błędy są gromadzone równomiernie podczas iteracji.

Rasteryzator referencyjny Direct3D używa podejścia bezpośredniej oceny do obliczania indeksów tekstur dla każdego położenia piksela. Ocena bezpośrednia różni się od podejścia iteracyjnego, ponieważ każda niedokładność operacji wykazuje bardziej losowy rozkład błędów. Wynikiem tego jest to, że błędy próbkowania występujące na granicach mogą być bardziej zauważalne, ponieważ rasterizator odniesienia nie wykonuje tej operacji z doskonałą dokładnością.

Najlepszym rozwiązaniem jest użycie filtrowania najbliższych punktów tylko wtedy, gdy jest to konieczne. Gdy musisz to zastosować, zaleca się nieznaczne przesunięcie współrzędnych tekstury od pozycji granic, aby uniknąć artefaktów.

filtrowanie tekstury