Bilinear filtrowania - Bilinear filtering

Powiększony niewielka część z bitmapy , przy użyciu najbliższego sąsiada filtrowanie (po lewej) , filtrowanie bilinear (środkowy) i filtrowanie Bicubic (po prawej) .

Filtrowanie Dwuliniowe jest filtrowanie tekstur Metoda stosowana w celu wygładzenia tekstur gdy wyświetlane większe lub mniejsze niż są w rzeczywistości.

Większość czasu, gdy rysunek teksturą kształtu na ekranie, faktura nie jest wyświetlana dokładnie tak, jak jest on przechowywany, bez zniekształceń. Z tego powodu większość pikseli skończy się konieczności korzystania z punktu na fakturze, która jest „pomiędzy” teksele - zakładając teksele są punkty (w przeciwieństwie do, powiedzmy, kwadraty) - w środku (lub w lewym górnym rogu, lub gdziekolwiek indziej, to nie ma znaczenia, tak długo, jak jest to zgodne) z ich „komórek”. Filtrowanie Dwuliniowe wykorzystuje te punkty do wykonywania bilinear interpolacji pomiędzy czterema tekseli najbliższego punktu, który reprezentuje piksel (w środku lub lewego górnego piksela, zazwyczaj).

Formuła

W kontekście matematycznej interpolacji dwuliniowo jest problem znalezienia funkcji f (x, y) w postaci

dogadzający

Zazwyczaj, i zazwyczaj obliczeniowo najtańszy sposób obliczania jest przez interpolację liniową używane dwa razy, na przykład obliczyć dwie funkcje i satysfakcjonujące

a następnie łączyć te funkcje (który jest liniowa ) w funkcji jednej spełniających

W grafice komputerowej, filtrowanie bilinear jest zazwyczaj wykonywane na tekstury podczas mapowania tekstur, lub na bitmapę podczas zmiany rozmiaru. W obu przypadkach źródła danych (bitmapy) lub struktura mogą być postrzegane jako dwuwymiarowej tablicy wartości lub kilka (zazwyczaj trzy) są w przypadku danych w pełnym kolorze. Punkty danych stosowane w Filtrowanie Dwuliniowe są punkty 2x2 wokół lokalizacji, dla których kolor ma być interpolowane.

Ponadto, nie trzeba obliczyć rzeczywiste współczynniki funkcji ; obliczenie wartości jest wystarczające.

Największą liczbę całkowitą nie większą niż x zwołuje i ułamkowa część będzie . Następnie , i . Mamy , , , . Punkty danych wykorzystywane do interpolacji są pobierane z tekstury / bitmapy i przypisany do , , , i .

, To dwa punkty danych dla odjęcie były z tego ostatniego wydajnością

Ponieważ jest liniowy, jego pochodna jest stała i równa

ponieważ ,

i podobnie,

Ponieważ mamy obliczone punkty końcowe i potrzebne do drugiego etapu interpolacji.

Drugi etap polega na obliczeniu , co może być osiągnięte przez samego wzoru, stosowanego do obliczania wartości pośrednich:

W przypadku skalowania, Y pozostaje stała w tym samym wierszu przeskalowanym obrazu i zapisywania wyników pośrednich i ponowne ich do obliczenia następnego piksela może prowadzić do znacznych oszczędności. Podobne oszczędności można osiągnąć ze wszystkimi „bi” rodzaju filtracji, czyli takie, które mogą być wyrażone w postaci dwóch przejściach filtrowania jednowymiarowej.

W przypadku mapowania tekstur, stała x lub y jest rzadko, jeśli kiedykolwiek spotkałem, a ponieważ dzisiejszy metalowe (2000+) grafika jest bardzo parallelized, nie byłoby żadnych oszczędności czasowe i tak.

Innym sposobem pisania formuły interpolacji jest dwuliniowy

Przykładowy kod

Kod ten zakłada, że struktura jest kwadratowy (bardzo częstym zjawiskiem), że nie Mipmapping jest w użyciu, a tam jest tylko jeden kanał danych (jest to rzadkością. Prawie wszystkie tekstury są w kolorze, dlatego mając czerwony, zielony i niebieskie kanały, a wiele z nich kanał przezroczystości alfa, więc musimy zrobić trzy lub cztery obliczenia Y, po jednym dla każdego kanału). Położenie współrzędnych UV jest w centrum Texel. Na przykład, {(0.25,0.25), (0.75,0.25), (0.25,0.75), (0.75,0.75)} są wartości 2x2 tekstury.

 double getBilinearFilteredPixelColor(Texture tex, double u, double v) {
   u = u * tex.size - 0.5;
   v = v * tex.size - 0.5;
   int x = floor(u);
   int y = floor(v);
   double u_ratio = u - x;
   double v_ratio = v - y;
   double u_opposite = 1 - u_ratio;
   double v_opposite = 1 - v_ratio;
   double result = (tex[x][y]   * u_opposite  + tex[x+1][y]   * u_ratio) * v_opposite + 
                   (tex[x][y+1] * u_opposite  + tex[x+1][y+1] * u_ratio) * v_ratio;
   return result;
 }

ograniczenia

Filtrowanie Dwuliniowe jest dość dokładne aż skalowanie tekstur spadnie poniżej połowy lub powyżej podwójnym oryginalnej wielkości tekstury - to znaczy, jeśli faktura był 256 pikseli w każdym kierunku, skalowanie go do poniżej 128 lub powyżej 512 pikseli może mieć fakturę wyglądają źle z powodu brakujących pikseli lub zbyt dużo gładkość. Często w grach lub innych aplikacjach renderingu 3-D, Mipmapping służy do zapewnienia skalowana w dół wersji tekstury dla lepszej wydajności; Jednakże przejście pomiędzy dwiema różnie wielkości mipmap teksturę w perspektywie filtrować dwuliniowego może bardzo gwałtownie. Filtrowanie trójliniowe , choć nieco bardziej skomplikowane, może uczynić to przejście gładkie całym. W świecie 2-D zmiana rozmiaru obrazu, bicubic interpolacji jest zwykle korzystne dla iluzji, że ostrość i tworzy na jego lepsze właściwości anty-aliasing; Jednak większość bicubics to osiągnąć dzięki połączeniu zacieranie i dzwonienie artefakty. Hermite'a filtr, który jest jedynym sześcienny, który dodaje ani zacieranie ani dzwonka, nie anti-alias lepiej niż interpolacji liniowej robi, ale nadal jest nieco ostrzejszy.

Na szybki pokaz jak Texel może zabraknąć w filtrowanej tekstury, oto lista numerów reprezentujących ośrodki pudełkach z 8-Texel całej tekstury (w kolorze czerwonym i czarnym), przemieszane z numerami od centrów pudełkach z 3-teksela szerokości dół próbą tekstury (na niebiesko). Czerwone liczby reprezentują teksele które nie byłyby stosowane przy obliczaniu tekstury 3-Texel w ogóle.

0,0625, 0,1667 , 0,1875, 0,3125 , 0,4375, 0,5000 , 0,5625, 0,6875 , 0,8125, 0,8333 , 0,9375

przypadki szczególne

Tekstury nie są nieskończone, w ogóle, a czasem kończy się jeden piksel współrzędnych, który leży poza siatkę współrzędnych Texel. Istnieje kilka sposobów, aby sobie z tym poradzić:

  • Owinąć teksturę, tak że ostatni Texel w rzędzie również przychodzi tuż przed pierwszą, a ostatnią Texel w kolumnie również pochodzi tuż nad pierwszą. To działa najlepiej, gdy faktura jest kafelki.
  • Uczynić obszar poza tekstur w jednym kolorze. Może to być użyteczne dla tekstury przeznaczone do układania na jednolitym tle lub być przejrzyste.
  • Powtórzyć teksele krawędzi się w nieskończoność. To działa najlepiej, jeśli faktura nie jest przeznaczony do powtórzenia.

Zobacz też