Filtrowanie dwuliniowe

Filtrowanie dwuliniowe, filtrowanie biliniowe (ang. bilinear filtering) – technika znana z grafiki komputerowej mająca na celu poprawę jakości wyświetlania tekstur – polega ona na obliczaniu wartości (interpolacji) pomiędzy dyskretnymi punktami w teksturze zwanymi tekselami. Dzięki tej metodzie wyświetlane tekstury stają się gładsze.

Powiększony fragment bitmapy, w której użyto (od lewej) filtrowania najbliższego sąsiada, filtrowania biliniowego i filtrowania bikubicznego

Opis metodyEdytuj

 
Wartość w punkcie P jest obliczana na podstawie dwuliniowej interpolacji pomiędzy narożnymi punktami Q

Dwuwymiarowa tekstura w grafice komputerowej najczęściej jest reprezentowana jako dwuwymiarowa tablica teksli – punktów, których atrybutem jest np. kolor. Tego typu bitmapa ma określoną rozdzielczość, a wyświetlanie jej na ekranie komputera, polega na tym, że każdemu pikselowi przydzielany jest odpowiedni teksel. Najprostszą metodą takiego mapowania jest zastosowanie metryki najbliższego sąsiada (ang. nearest neighbour), czyli dla danego piksela wybierany jest najbliższy teksel. Niestety przy powiększeniu takiej tekstury widoczne stają się prostokątne obszary reprezentujące odpowiednie teksle. Aby temu zapobiec, stosuje się filtrowanie dwuliniowe, polegające na interpolacji wartości pomiędzy punktami reprezentującymi teksele.

Niech dla danego piksela na ekranie obliczony zostanie punkt   w przestrzeni tekstury. Niech odpowiednie punkty reprezentujące teksle będą znajdowały się odpowiednio w punktach         oraz:

 
 

Wówczas obliczona wartość tekstury w punkcie   będzie wynosić:

 

gdzie   zaś  

Przykład implementacjiEdytuj

W języku C procedura filtrowania dwuliniowego może zostać zaimplementowana następująco:

double getBilinearFilteredPixelColor( Texture tex, double u, double v )
{
    u *= tex.size;
    v *= tex.size;
    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;
}

Zobacz teżEdytuj

BibliografiaEdytuj

  • Foley J.D., Van Dam A., Feiner S.K., Hughes J.F., Phillips R.L.: Introduction to Computer Graphics, Addison-Wesley Longman Publishing Co. Inc., 1994.