Filtrowanie dwuliniowe

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

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.

Opis metody[edytuj | edytuj kod]

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 implementacji[edytuj | edytuj kod]

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 | edytuj kod]

Bibliografia[edytuj | edytuj kod]

  • 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.