Filtrowanie dwuliniowe

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacja, szukaj
Powiększony fragment bitmapy, w której używane jest filtrowanie najbliższego sąsiada (po lewej), filtrowanie biliniowe (pośrodku) i filtrowanie bikubiczne (po prawej).

Filtrowanie dwuliniowe, filtrowanie biliniowe ((ang.) Bilinear filtering) to 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. Dzięki tej metodzie wyświetlane tekstury stają się gładsze.

Opis[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. Bitmapa tego typu ma określoną rozdzielczość. Przy wyświetlaniu takiej tekstury na ekranie komputera, każdemu pikselowi przydzielany jest odpowiedni teksel (najprostszą metodą jest zastosowanie metryki najbliższego sąsiada - wybierany jest najbliższy teksel). 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 teksle.

Niech dla danego piksela na ekranie obliczony zostanie punkt \displaystyle (x,y) w przestrzeni tekstury. Niech odpowiednie punkty reprezentujące teksle będą znajdowały się odpowiednio w punktach \displaystyle Q_{11}=(x_1,y_1), \displaystyle Q_{12} = (x_1,y_2), \displaystyle Q_{21} = (x_2,y_1), \displaystyle Q_{22} = (x_2,y_2) oraz:

x_1 \leqslant x \leqslant x_2
y_1 \leqslant y \leqslant y_2

Wówczas obliczona wartość tekstury w punkcie \displaystyle (x,y) będzie wynosić:

\displaystyle Q(x,y) = Q_{11} u v + Q_{12} u (1-v) + Q_{21} (1-u) v + Q_{22} (1-u)(1-v)

gdzie u = \frac{x - x_1}{x_2 - x_1}, zaś v = \frac{y - y_1}{y_2 - y_1}.

Przykład implementacji[edytuj | edytuj kod]

W języku C procedura filtrowania dwuliniowego mogłaby 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]

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