próbkowanie Nearest-Point (Direct3D 9)
Aplikacje nie są wymagane do używania filtrowania tekstur. Direct3D można ustawić tak, aby obliczał adres texelu, która często nie przyjmuje wartości całkowitych, i kopiował kolor texelu z najbliższym adresem całkowitym. Ten proces jest nazywany próbkowaniem najbliższego punktu. Może to być szybki i wydajny sposób przetwarzania tekstur, jeśli rozmiar tekstury jest podobny do rozmiaru obrazu pierwotnego na ekranie. Jeśli nie, tekstura musi być powiększona lub pomniejszona. Obraz może być kanciasty, z aliasingiem lub rozmyty.
Aplikacja C++ może wybrać próbkowanie najbliższego punktu, wywołując metodę IDirect3DDevice9::SetSamplerState. Ustaw wartość pierwszego parametru na liczbę indeksu całkowitego (0–7) tekstury, dla której wybierasz metodę filtrowania tekstury. Przekaż D3DSAMP_MAGFILTER, D3DSAMP_MINFILTER lub D3DSAMP_MIPFILTER dla drugiego parametru, aby ustawić filtr powiększenia, pomniejszenia lub mipmapowania. Przekaż D3DTEXF_POINT w trzecim parametrze.
Należy ostrożnie używać próbkowania najbliższego punktu, ponieważ czasami może powodować artefakty graficzne, gdy tekstura jest próbkowana na granicy między dwoma texelami. Granica ta jest położeniem wzdłuż tekstury (u lub v), w której próbkowane 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 zarówno z sąsiednich texelsów, jak 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.
Zwróć uwagę, że dwa kwadraty w prawym górnym rogu grupy wydają się inne niż ich sąsiedzi, z ukośnymi przesunięciami przebiegającymi przez nie. 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 wartości przestrzeni całkowitej w zakresie od [ - 0,5, n - 0,5], gdzie n jest liczbą texelów w danym wymiarze tekstury. Wynikowy indeks tekstury jest zaokrąglany do najbliższej liczby całkowitej. To mapowanie może wprowadzać 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 D3DTADDRESS_WRAP. Mapowanie stosowane przez Direct3D mapuje indeks tekstury u zgodnie z poniższym diagramem dla tekstury o szerokości 4 tekseli.
Zwróć uwagę, że 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 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.
To oznacza, że powiększenie małej tekstury, używając współrzędnych tekstury 0,0 i 1,0 z filtrowaniem najbliższych punktów na trójkącie wyrównanym względem przestrzeni ekranu, powoduje, że piksele, w 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ż rasteryzator 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.
Tematy pokrewne